我在想,如果有一个自子查询转换为自加入 这里的方式是自子查询转换自子查询到自加入
SELECT a,
b
FROM c AS t1
WHERE (b IN (SELECT b
FROM c AS t2
WHERE (t1.b = b)
AND (t1.e <> e)))
我在想,如果有一个自子查询转换为自加入 这里的方式是自子查询转换自子查询到自加入
SELECT a,
b
FROM c AS t1
WHERE (b IN (SELECT b
FROM c AS t2
WHERE (t1.b = b)
AND (t1.e <> e)))
如果你只想找到一个副本会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
(请注意,我用的>
代替<>
)
'IN'和'EXISTS'可能会给出相同的计划。 – 2012-03-18 21:58:05
SELECT t1.a, t2.b
FROM c as t1
join c as t2 on t1.b=t2.b
WHERE t1.e <> t2.e
select t1.a
, t1.b
from c as t1
join c as t2
on t1.b = t2.b
and t1.e <> t2.e
由于e
是主键处理这个的另一种方式是
SELECT a,
b
FROM (SELECT a,
b,
COUNT(*) OVER (PARTITION BY b) AS Cnt
FROM c) T1
WHERE Cnt > 1
你的子查询甚至在干什么?看起来你可以摆脱它... – jle 2012-03-18 21:24:43
它检查是否在表中的东西具有相同的值b – 2012-03-18 21:27:54
和e是用于区分事物的主键 – 2012-03-18 21:30:24