1

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

Table 1:
UID
A
B

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

这是我现在正在做的事情:

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,但似乎无法在所有其他加入的情况下得到我想要的。

如果我找到解决方案,我将继续工作并发布。

编辑:这是我想要结束的

在第一次内部加入之后,我会

A
B

在第二次内部加入之后,我将拥有:

A    D 
A    F
B    D
B    F

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

编辑:RDBMS 是 SQL server 2005、2008r2、2012

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

DECLARE @Table1 TABLE ( [UNIQUE_ID] INT PRIMARY KEY )

Table2 在唯一 ID 上有一个聚集索引

4

2 回答 2

1

对此的一般方法是使用仅选择不匹配LEFT JOIN的 where 子句:

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 
于 2013-07-01T21:27:22.280 回答
-1
SELECT Table2.*
FROM Table2
INNER JOIN (
  SELECT id FROM Table2
  EXCEPT
  SELECT id FROM Table1
) AS Filter ON (Table2.id = Filter.id)
于 2013-07-01T21:23:20.887 回答