SQL 服务器查询以查找没有关联的透视表之间的记录

SQL Server query to find records between pivoted tables where there is no association

我正在尝试编写一个查询,该查询 return 是来自两个表的记录列表,其中两个表没有关联到每个表的记录,或者发现一个标志说不关联记录。

例如:

房子

╔════╦══════════════╦
║ Id ║  Name        ║
╠════╬══════════════╬
║  1 ║ 10 Maple     ║
║  2 ║ 20 Oak       ║
║  3 ║ 30 Drive     ║
╚════╩══════════════╩

房屋居住者

╔════╦══════════════╦═════════════╦════════════════╗
║ Id ║  HouseId     ║ OccupentId  ║ LeftOn         ║
╠════╬══════════════╬═════════════╬════════════════╣
║  1 ║ 1            ║  1          ║ NULL           ║
║  2 ║ 1            ║  1          ║ 2019-01-01     ║
║  3 ║ 3            ║  2          ║ 2019-01-01     ║
╚════╩══════════════╩═════════════╩════════════════╝

我正在尝试编写 SQL 查询来查找 'Empty' 房屋。例如。没有居住者或居住者离开的房屋。最终结果将是:

╔════╦══════════════╦
║ Id ║  Name        ║
╠════╬══════════════╬
║  2 ║ 20 Oak       ║
║  3 ║ 30 Drive     ║
╚════╩══════════════╩

请注意 1 号房不在此列表中,因为即使住户离开了,他又回来了。

我目前的查询(非常离谱)如下所示:

SELECT *
FROM Houses H
INNER JOIN HousesOccupants HO ON HO.HouseId = H.Id
WHERE NOT EXISTS (
        SELECT *
        FROM HousesOccupants
        WHERE HousesOccupants.LeftOn IS NULL
            AND HO.HouseId = H.Id
        )
    OR (HO.Id IS NULL)

如何将以下查询修复为 return 正确的数据集?

您的查询有几个问题:

  • not exists中的子查询与外部查询不相关

  • 即使是,它也会 return 居住者离开的房屋,而不是从未有人居住的房屋:那些被 INNER JOIN 淘汰。请注意,ORDed 条件是空操作,因为 INNER JOIN 消除了从未有人居住的房屋

我只想使用 not exists 过滤 houseOccupant 中没有记录的房屋,leftOnnull:

select h.*
from houses h
where not exists (
    select 1
    from houseOccupants ho
    where ho.houseId = h.id and ho.leftOn is null
)