我在优化查询时遇到了问题。下面是我正在使用的两个示例表:
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,其中另一个表为null,但似乎无法在所有其他JOIN的情况下获得我想要的结果。
如果我找到一个解决方案,我会继续工作和帖子。
编辑:这就是我想要的结果
在第一次内连接之后,我将拥有
A
BAFter我会有的第二个内部联接:
A D
A F
B D
B F上面的第二列只是为了表示它与具有相同父UID的其他UID匹配,但是我仍然需要As和Bs作为UID。
编辑: RDBMS为SQL server 2005,2008r2,2012
在没有索引的查询中声明了Table1
DECLARE @Table1 TABLE ( [UNIQUE_ID] INT PRIMARY KEY )Table2具有唯一ID的聚集索引
发布于 2013-07-02 05:27:22
一般方法是使用带有where子句的LEFT JOIN,该子句只选择不匹配的行:
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-02 05:23:21
SELECT Table2.*
FROM Table2
INNER JOIN (
SELECT id FROM Table2
EXCEPT
SELECT id FROM Table1
) AS Filter ON (Table2.id = Filter.id)https://stackoverflow.com/questions/17413627
复制相似问题