2012-03-18 78 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