SQL使用连接而不是“不在”

问题描述 投票:1回答:2

我正在尝试重写此查询以删除左边连接中的“not in”,但我一直在困惑自己。 (没有惊喜)

原始查询:

select parentfolderid from folderrelationships with (nolock)
where childfolderid = 14908
and parentfolderid not in (select folderid from folders with (nolock) where typeid in (153,155))

我的新版本:

select parentfolderid from folderrelationships fr with (nolock)
LEFT JOIN folders f on f.FolderId = fr.ParentFolderID
where childfolderid = 14908 AND f.TypeID in (153,155)

但我没有得到任何结果......我只是没有得到它。

我认为问题在于考虑所有的'TypeId in(153,155)'。那令我困惑的地方放在哪里。

sql sql-server
2个回答
3
投票

为了将NOT IN重写为LEFT JOIN,您需要检查LEFT JOIN结果是否为NULL。

select parentfolderid from folderrelationships fr with (nolock)
LEFT JOIN folders f on f.FolderId = fr.ParentFolderID AND f.TypeID in (153,155)
where childfolderid = 14908 AND f.TypeID IS NULL

LEFT JOIN将检索满足条件的行和其他不满足条件的行。你只想保留那些没有的,所以你检查你从文件夹表中得不到任何东西(f.TypeID IS NULL - >使用PK而不是TypeId,但我不知道你的表结构)。

另一方面,如果你因为性能问题而重写它,我认为你不会做得更好。


0
投票

在SQL表达式中,Join通常是一个昂贵的操作;因此,我必须警告你“在尝试转换为左连接之前考虑一下”。但是,为什么离开加入为什么不只是一个简单的内部联接?左/右连接为没有匹配记录的那些产生NULL值。在您的情况下,看起来您正在寻找仅匹配的案例。

© www.soinside.com 2019 - 2024. All rights reserved.