我有一个同时包含相同的密钥的p_id 2个表:SQL加入()不工作
test1 test2
+-------------+ +----------------------+
| p_id | name | | o_id | name | p_id |
+-------------+ +----------------------+
| 1 | Paul | | 1 | London | 1 |
| 2 | Marc | | 2 | Paris | 1 |
+-------------+ +----------------------+
现在我想从TEST1有没有关系,Test2的所有条目。 在上面的例子中,我抽象了我的表,所以RIGHT JOIN
是不可能的(实际上我必须加入4个表格)。
SELECT a.*,b.*
FROM test1 a
LEFT JOIN test2 b
ON a.p_id=b.p_id
WHERE b.p_id NOT IN(SELECT DISTINCT p_id FROM test2);
我预计有一行p_id=2
。但是我得到一个空的结果。 当我将我的代码更改为:
SELECT a.*,b.*
FROM test1 a
LEFT JOIN test2 b
ON a.p_id=b.p_id
WHERE a.p_id NOT IN(SELECT DISTINCT p_id FROM test2);
然后它工作正常。但为什么?我想LEFT JOIN
首先处理(1行作为结果)和WHERE
被处理后(JOIN一直没有找到p_id
在test2
所以b.p_id
是null
- null
是不是在子查询 - 所以还是1行作为结果)。
有人可以解释这种行为吗?
我没有看到任何问题。您的LEFT JOIN在第二个表格中获得p_id = 1的2行但是,您将子查询中的那些排除 – Mihai
@RaymondNijland:对不起,但这是不正确的。我检查了你的sugesstion,现在我得到了2行,其中p_id和test1.name被设置,其他列为空。 – zuluk
@Mihai:这是不正确的。左连接的结果是3行(2个p_id = 1,1个p_id = 2),然后我用p_id = 1排除两者。 – zuluk