当我进行内部连接时,会得到重复的行,如何正确地编写sql

当我进行内部连接时,会得到重复的行,如何正确地编写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表

我试图创建一个场景,在这个场景中,我似乎总是在编写查询时陷入困境

我希望sql输出只是users表中的用户列表,没有额外的列或重复的行

我的表格如下:

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
,其中
条款现在正在使用!