当我进行内部连接时,会得到重复的行,如何正确地编写sql
我试图创建一个场景,在这个场景中,我似乎总是在编写查询时陷入困境 我希望sql输出只是users表中的用户列表,没有额外的列或重复的行 我的表格如下:当我进行内部连接时,会得到重复的行,如何正确地编写sql,sql,sql-server,inner-join,Sql,Sql Server,Inner Join,我试图创建一个场景,在这个场景中,我似乎总是在编写查询时陷入困境 我希望sql输出只是users表中的用户列表,没有额外的列或重复的行 我的表格如下: Users Locations Location_Types Location_Types_Zones 下面的查询是我想要的,但是当我开始与location\u type\u zone表进行内部连接时,问题就出现了。这最终破坏了结果集(就我想要的而言)。如果我要删除location_type_zone内部联接和我还需要联接到属性联接zones表
Users
Locations
Location_Types
Location_Types_Zones
下面的查询是我想要的,但是当我开始与location\u type\u zone表进行内部连接时,问题就出现了。这最终破坏了结果集(就我想要的而言)。如果我要删除location_type_zone内部联接和我还需要联接到属性联接zones表的location_type表,则输出的格式将是正确的,但正确性将关闭,因为我没有按确切的location_类型“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“问题”的最佳方法是什么
已更新
我根据评论更新了修复程序,对此表示抱歉。可读的方法是
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')
)
或者,作为过滤连接
类似:
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
在不知道实际数据是什么的情况下,我猜types\u zones表中有多条记录与位置\u类型中的“父”记录相匹配,因此您将得到所有这些子记录“重复”。我还要加上我的两美分。看起来您的最后一次
内部联接
是不必要的,因为您没有在选择
或中使用ltz
,其中
条款现在正在使用!