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
淘汰。请注意,ORD
ed 条件是空操作,因为 INNER JOIN
消除了从未有人居住的房屋
我只想使用 not exists
过滤 houseOccupant
中没有记录的房屋,leftOn
即 null
:
select h.*
from houses h
where not exists (
select 1
from houseOccupants ho
where ho.houseId = h.id and ho.leftOn is null
)
我正在尝试编写一个查询,该查询 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
淘汰。请注意,ORD
ed 条件是空操作,因为INNER JOIN
消除了从未有人居住的房屋
我只想使用 not exists
过滤 houseOccupant
中没有记录的房屋,leftOn
即 null
:
select h.*
from houses h
where not exists (
select 1
from houseOccupants ho
where ho.houseId = h.id and ho.leftOn is null
)