【问题标题】:SQL Server query to find records between pivoted tables where there is no associationSQL Server 查询以查找没有关联的透视表之间的记录
【发布时间】:2020-05-15 03:24:00
【问题描述】:

我正在尝试编写一个查询,该查询返回两个表中的记录列表,其中表没有与每个表关联的记录,或者发现一个标志表示不关联记录。

例如:

房子

╔════╦══════════════╦
║ 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 查询来查找“空”房屋。例如。没有居住者或居住者离开的房屋。最终结果是:

╔════╦══════════════╦
║ 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)

如何修复以下查询以返回正确的数据集?

【问题讨论】:

  • 您从该查询中得到什么结果? HO.Id IS NULL 永远不会是 NULL,除非您使用 LEFT JOIN

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

您的查询有几个问题:

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

  • 即使是这样,它也会返回居住者离开的房屋,但不会返回从未有居住者的房屋:这些已被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
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-06
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    相关资源
    最近更新 更多