我正在尝试重写此查询以删除左边连接中的“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)'。那让我感到困惑的是把它放在哪里。
答案 0 :(得分: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,但我不知道你的表结构)。
另一方面,如果你因为性能问题而重写它,我认为你不会更好地做到这一点。
答案 1 :(得分:0)
在SQL表达式中,Join通常是一项昂贵的操作;因此,我必须警告你"在你试图转换成左连接之前考虑一下#34;。但是,为什么离开加入为什么不只是一个简单的内部联接?左/右连接为不具有匹配记录的值生成NULL值。在您的情况下,看起来您正在寻找仅匹配的案例。