当我内部连接时,我得到重复的行,如何正确编写 sql
When I inner join, I get duplicate rows, how to properly write sql
我正在尝试创建一个我在编写查询时似乎总是卡住的场景。
我希望 sql 输出只是来自用户 table 的用户列表,没有额外的列或重复的行。
我拥有的 table 是:
Users
Locations
Location_Types
Location_Types_Zones
下面的查询正是我所追求的,但是当我开始使用 location_type_zone table 进行 INNER JOIN 时,问题就出现了。这最终会破坏结果集(就我想要的而言)。如果我要删除 location_type_zone 内部连接和 location_type table 我还需要连接到 属性 连接区域 table,格式输出将是正确的,但正确性将关闭,因为我没有按确切的 location_types 'A'、'B'、'C'.
进行过滤
SELECT u.*
FROM Users u.
INNER JOIN Locations l
ON u.location_id = l.location_id
INNER JOIN location_types lt
ON l.location_type = lt.location_type_id
INNER JOIN location_types_zones ltz
ON lt.location_types_zone_id = ltz.location_types_zone_id
WHERE u.approved = 1
AND ltz.location_types_zone_code IN ('A', 'B', 'C')
解决此类问题的最佳方法是什么sql "issue"?
已更新
我根据评论更新了修复程序,对此感到抱歉。
可读的方法是 exists
子句:
SELECT *
FROM Users u
WHERE approved = 1
AND EXISTS
(
SELECT *
FROM Locations l
JOIN location_types lt
ON l.location_type = lt.location_type_id
JOIN location_types_zones ltz
ON lt.location_types_zone_id = ltz.location_types_zone_id
WHERE u.location_id = l.location_id
AND ltz.location_types_zone_code IN ('A', 'B', 'C')
)
或者,作为过滤 join
,例如:
SELECT u.*
FROM Users u
JOIN (
SELECT DISTINCT l.location_id
FROM Locations l
JOIN location_types lt
ON l.location_type = lt.location_type_id
JOIN location_types_zones ltz
ON lt.location_types_zone_id = ltz.location_types_zone_id
WHERE lt.location_types_zone_code IN ('A', 'B', 'C')
) loc
ON u.location_id = loc.location_id
WHERE approved = 1
我正在尝试创建一个我在编写查询时似乎总是卡住的场景。
我希望 sql 输出只是来自用户 table 的用户列表,没有额外的列或重复的行。
我拥有的 table 是:
Users
Locations
Location_Types
Location_Types_Zones
下面的查询正是我所追求的,但是当我开始使用 location_type_zone table 进行 INNER JOIN 时,问题就出现了。这最终会破坏结果集(就我想要的而言)。如果我要删除 location_type_zone 内部连接和 location_type table 我还需要连接到 属性 连接区域 table,格式输出将是正确的,但正确性将关闭,因为我没有按确切的 location_types 'A'、'B'、'C'.
进行过滤SELECT u.*
FROM Users u.
INNER JOIN Locations l
ON u.location_id = l.location_id
INNER JOIN location_types lt
ON l.location_type = lt.location_type_id
INNER JOIN location_types_zones ltz
ON lt.location_types_zone_id = ltz.location_types_zone_id
WHERE u.approved = 1
AND ltz.location_types_zone_code IN ('A', 'B', 'C')
解决此类问题的最佳方法是什么sql "issue"?
已更新 我根据评论更新了修复程序,对此感到抱歉。
可读的方法是 exists
子句:
SELECT *
FROM Users u
WHERE approved = 1
AND EXISTS
(
SELECT *
FROM Locations l
JOIN location_types lt
ON l.location_type = lt.location_type_id
JOIN location_types_zones ltz
ON lt.location_types_zone_id = ltz.location_types_zone_id
WHERE u.location_id = l.location_id
AND ltz.location_types_zone_code IN ('A', 'B', 'C')
)
或者,作为过滤 join
,例如:
SELECT u.*
FROM Users u
JOIN (
SELECT DISTINCT l.location_id
FROM Locations l
JOIN location_types lt
ON l.location_type = lt.location_type_id
JOIN location_types_zones ltz
ON lt.location_types_zone_id = ltz.location_types_zone_id
WHERE lt.location_types_zone_code IN ('A', 'B', 'C')
) loc
ON u.location_id = loc.location_id
WHERE approved = 1