繁体   English   中英

如何使用不存在而不是内部联接?

[英]How to use not exists instead of inner join?

练习题:

使用NOT EXISTS子句检查dogs表中不在users表中的所有用户。

我可以使用以下内部联接获得正确的答案:

select d.user_guid as UserID, d.dog_guid as DogID 
from dogs d
left join users u
on d.user_guid = u.user_guid
where u.user_guid is null;

但是,我无法通过“不存在”子查询获得正确答案:

select d.user_guid as dUserID, d.dog_guid as dDogID
from dogs d
where not exists (select distinct u.user_guid from users u);

上面我的错误查询的输出:

+---------+--------+
| dUserID | dDogID |
+---------+--------+

答案查询:

select d.user_guid as dUserID, d.dog_guid as dDogID
from dogs d
where not exists (select distinct u.user_guid 
                  from users u 
                  where u.user_guid = d.user_guid);

答案输出:

+---------+--------------------------------------+
| dUserID | dDogID                               |
+---------+--------------------------------------+
| None    | fd7c0a66-7144-11e5-ba71-058fbc01cf0b |
+---------+--------------------------------------+
| None    | fdbb6b7a-7144-11e5-ba71-058fbc01cf0b |
+---------+--------------------------------------+

我想知道什么可能的原因是为什么Not Exists where子句中的u.user_guid = d.user_guid导致我的Not Exists子查询出错。

因为not exists (select distinct u.user_guid from users u)始终返回false

你可以尝试NOT IN像这样

SELECT
    d.user_guid AS dUserID,
    d.dog_guid AS dDogID
FROM
    dogs d
WHERE
    d.user_guid NOT IN (SELECT DISTINCT u.user_guid FROM user AS u);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM