带标准的sql不匹配的密钥

时间:2016-04-04 21:08:44

标签: sql select join ms-access-2013

这几乎是一个左连接的情况,但我不知道如何在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的复杂语义。)

1 个答案:

答案 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