首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sql NOT IN优化

Sql NOT IN优化
EN

Stack Overflow用户
提问于 2013-07-02 05:00:38
回答 2查看 4.5K关注 0票数 1

我在优化查询时遇到了问题。下面是我正在使用的两个示例表:

代码语言:javascript
复制
Table 1:
UID
A
B

Table 2:
UID   Parent
A       2
B       2
C       3
D       2
E       3
F       2

下面是我正在做的事情:

代码语言:javascript
复制
Select Table1.UID
FROM Table1 R

INNER JOIN Table2 T ON
R.UID = T.UID

INNER JOIN Table2 E ON
T.PARENT = E.PARENT
AND E.UID NOT IN (SELECT UID FROM Table1)

我尽量避免使用NOT IN子句,因为在处理大量记录时存在明显的性能障碍。

我知道避免NOT IN子句的典型方法,如LEFT JOIN,其中另一个表为null,但似乎无法在所有其他JOIN的情况下获得我想要的结果。

如果我找到一个解决方案,我会继续工作和帖子。

编辑:这就是我想要的结果

在第一次内连接之后,我将拥有

代码语言:javascript
复制
A
B

AFter我会有的第二个内部联接:

代码语言:javascript
复制
A    D 
A    F
B    D
B    F

上面的第二列只是为了表示它与具有相同父UID的其他UID匹配,但是我仍然需要As和Bs作为UID。

编辑: RDBMS为SQL server 2005,2008r2,2012

在没有索引的查询中声明了Table1

代码语言:javascript
复制
DECLARE @Table1 TABLE ( [UNIQUE_ID] INT PRIMARY KEY )

Table2具有唯一ID的聚集索引

EN

回答 2

Stack Overflow用户

发布于 2013-07-02 05:27:22

一般方法是使用带有where子句的LEFT JOIN,该子句只选择不匹配的行:

代码语言:javascript
复制
Select Table1.UID
FROM Table1 R    
JOIN Table2 T ON R.UID = T.UID
JOIN Table2 E ON T.PARENT = E.PARENT
LEFT JOIN Table3 E2 ON E.UID = R.UID
WHERE E2.UID IS NULL 
票数 1
EN

Stack Overflow用户

发布于 2013-07-02 05:23:21

代码语言:javascript
复制
SELECT Table2.*
FROM Table2
INNER JOIN (
  SELECT id FROM Table2
  EXCEPT
  SELECT id FROM Table1
) AS Filter ON (Table2.id = Filter.id)
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17413627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档