这几乎是一个左连接的情况,但我不知道如何在sql中表达它。
考虑一个包含字段Orders
的表User, Item, Flag
。我们需要一个出现在表中但没有Flag = True的行的用户列表。 (这些字段都没有空值。)等效地,User的所有行中的Flag = False,并且有这样的行。
我天真地写道:
SELECT T1.User FROM Orders AS T1 LEFT JOIN Orders AS T2 ON T1.User=T2.User WHERE T2.Flag=TRUE AND T2.User IS NULL
选择右边的行,然后检查连接是否没有匹配,但当然不起作用,因为它将两个条件应用于右侧的行
我试过了:
SELECT T1.User FROM Orders AS T1 WHERE T1.User NOT IN (SELECT DISTINCT User FROM Orders WHERE Flag=TRUE)
但是在Microsoft Access上,这非常慢,就好像正在为第一行的每一行运行第二个选择。
到目前为止,唯一的解决方案是从第二个选择创建一个临时表。但这是一个如此简单的问题,必须有一个好方法在sql中表达它。 (如果这很明显,我会道歉;我仍然在感受sql的复杂语义。)
答案 0 :(得分:0)
你的子查询解决方案是合理的,除非你有索引问题,否则我无法想象为什么它很慢。至于你的问题,我不确定我是否完全理解,但是如果你遇到了将过滤条件应用于两个表的问题,那么尝试将条件添加到连接条件而不是WHERE子句。
SELECT T1.User
FROM Orders AS T1
LEFT JOIN Orders AS T2
ON T1.User=T2.User
AND T2.Flag = 'TRUE'
WHERE T2.Flag=TRUE
AND T2.User IS NULL