2012-03-18 77 views
1

我在想,如果有一個自子查詢轉換爲自加入 這裏的方式是自子查詢轉換自子查詢到自加入

SELECT a, 
     b 
FROM c AS t1 
WHERE (b IN (SELECT b 
       FROM c AS t2 
       WHERE (t1.b = b) 
         AND (t1.e <> e))) 
+0

你的子查詢甚至在幹什麼?看起來你可以擺脫它... – jle 2012-03-18 21:24:43

+0

它檢查是否在表中的東西具有相同的值b – 2012-03-18 21:27:54

+0

和e是用於區分事物的主鍵 – 2012-03-18 21:30:24

回答

4

如果你只想找到一個副本會EXIST可能會更快:如果你想加入與每個記錄

SELECT a,b FROM c WHERE EXISTS(SELECT NULL FROM c c2 WHERE c2.b=c.b AND c2.e<>c.e) 

其複製但只有一次,每個記錄:

select t1.a 
,  t1.b 
,  t1.e as t1e 
,  t2.e as t2e 
from c as t1 
inner join c as t2 
on  t1.b = t2.b 
     and t1.e > t2.e 

(請注意,我用的>代替<>

+0

'IN'和'EXISTS'可能會給出相同的計劃。 – 2012-03-18 21:58:05

1
SELECT t1.a, t2.b 
FROM c as t1 
join c as t2 on t1.b=t2.b 
WHERE t1.e <> t2.e 
1
select t1.a 
,  t1.b 
from c as t1 
join c as t2 
on  t1.b = t2.b 
     and t1.e <> t2.e 
2

由於e是主鍵處理這個的另一種方式是

SELECT a, 
     b 
FROM (SELECT a, 
       b, 
       COUNT(*) OVER (PARTITION BY b) AS Cnt 
     FROM c) T1 
WHERE Cnt > 1