我正在尝试创建一个显示与另一个查询相反的查询(就像布尔值 NOT(。 这是第一个查询:
SELECT RoomNumber, StructureNumber
FROM TimeTables
WHERE HourNumber = 1 AND DayNumber = 1
我需要获取该查询结果中不存在的所有行。 第一次我尝试从第一个查询中减去整个表,但我无法做到这一点,因为 Access 中没有"例外"和 还因为我需要在四列之间减去(该表中有两个主键列( 这是我第一次尝试没有奏效:
SELECT RoomNumber, StructureNumber
FROM TimeTables
EXCEPT
SELECT RoomNumber, StructureNumber
FROM TimeTables
WHERE HourNumber = 1 AND DayNumber = 1
第二次,我尝试提取第一个查询中不存在但也没有工作的结果:
SELECT RoomNumber, StructureNumber
FROM TimeTables
WHERE NOT EXISTS(
SELECT RoomNumber, StructureNumber
FROM TimeTables
WHERE HourNumber = 1 AND DayNumber = 1)
我在互联网上搜索了解决方案,发现了一些与我的问题相似的东西,但没有一个对我有用。
>NOT EXISTS
需要您尚未提供的outer query
的引用
因此,您的NOT EXISTS
应该是:
SELECT t.*
FROM TimeTables t
WHERE NOT EXISTS (SELECT 1
FROM TimeTables t1
WHERE t1.RoomNumber = t.RoomNumber and t1.StructureNumber = t.StructureNumber and
t1.HourNumber = 1 AND t1.DayNumber = 1
);
但是,例如where
条款就足够
我认为这可以满足您的需求:
SELECT RoomNumber, StructureNumber
FROM TimeTables
GROUP BY RoomNumber, StructureNumber
HAVING SUM(IIF(HourNumber = 1 AND DayNumber = 1, 1, 0)) = 0;
HAVING
子句计算与指定条件匹配的行数(对于每个RoomNumber
/StructureNumber
组合(。= 0
表示没有这样的行。
只需将NOT EXISTS
子查询与主查询相关联,即可使用表别名t和sub进行简化:
SELECT t.*
FROM TimeTables t
WHERE NOT EXISTS
(SELECT 1
FROM TimeTables sub
WHERE sub.HourNumber = 1 AND sub.DayNumber = 1
AND sub.RoomNumber = t.RoomNumber
AND sub.StructureNumber = t.StructureNumber)
但只需运行一个反转逻辑的WHERE
子句:
SELECT t.*
FROM TimeTables t
WHERE t.HourNumber <> 1 OR t.DayNumber <> 1