Postgresql 在加入时显示重复的行

问题描述 投票:0回答:1

我是 SQL 新手,想要使用联接执行查询。

我注意到的是,当我的表中有两行时workers_send_times然后我将相同的行加倍,就像

start_time: 2024-01-01
end_time: 2024-01-02

start_time: 2024-01-01
end_time: 2024-01-02

start_time: 2024-01-01
end_time: 2024-01-02

start_time: 2024-01-01
end_time: 2024-01-02

所以我有 2 行,但得到 4 行。如果workers_send_times 表中有 4 行,那么我得到 16 行,所以它显示了重复的行。

我做错了什么?

    SELECT
    
    u.id,
    u.firstname,
    u.lastname,
    
    wp.location_orders_id,
    
    l.name,
    
    wst.start_time,
    wst.end_time
    
    FROM users u
    
    INNER JOIN workers_plan wp
    ON wp.user_id = u.id
    
    INNER JOIN workers_send_times wst
    ON wst.user_id = u.id
    
    LEFT JOIN location_orders lo
    ON lo.id = wp.location_orders_id
    
    LEFT JOIN location l
    ON l.id = lo.location_id
    
    WHERE u.id = '32dc3da6-1e56-4a14-b8b5-8f532edb1b04'

所以我用谷歌搜索如何防止然后我遇到了 group by。

我添加了GROUP_BY wst.id,因为我想按我的workers_send_times id进行分组,这样我就不会得到重复的行。

但是 Postgresql 对我说,我必须将所有选择的数据显示在分组中,如下所示:

    GROUP BY wst.id, u.id, wp.location_orders_id, l.name, wst.start_time, wst.end_time

所以现在它可以工作了,我没有得到重复的行,但是我错过了什么或者我可以做得更好吗?您会在我的查询中更改什么?

sql postgresql
1个回答
0
投票

这对于评论来说太长了,所以我将其添加为答案。 GROUP BY 是 SQL 中一个强大的运算符,但我感觉它经常被误解。在您的示例中,您可以添加一个或多个聚合函数,例如 COUNT、MIN、MAX 等。然后您可以将它们应用到每个组:

SELECT u.id
     , u.firstname
     , ...
     , COUNT(*)

如果你不打算在你的组中应用这样的功能,一个简写是使用 DISTINCT。 DISTINCT 不是一个函数,它适用于整行,您的示例将是:

SELECT DISTINCT u.id
     , u.firstname
     , ...
FROM users u
JOIN workers_plan wp
    ON wp.user_id = u.id
JOIN workers_send_times wst
    ON wst.user_id = u.id
LEFT JOIN location_orders lo
    ON lo.id = wp.location_orders_id
LEFT JOIN location l
    ON l.id = lo.location_id
WHERE u.id = '32dc3da6-1e56-4a14-b8b5-8f532edb1b04'    

我在示例中使用了较短形式的 INNER JOIN(仅 JOIN)。也就是说,你的方法很好而且更通用(假设你想稍后应用一个函数),但不同的是有点短,也许更明显。

© www.soinside.com 2019 - 2024. All rights reserved.