考虑下表
C1 || C2 || C3 || C4
--------------------------
1 || a || b || 1
2 || a || b || 4
3 || b || d || 2
4 || b || d || 2
问题1:选择列C2,C3,C4具有相同值的所有行,例如在上面的例子中选择第3行和第4行。
问题2:选择C4列重复的所有行,例如C4在第3行和第4行中具有值2,因此选择第3行和第4行。
问题1查询:
SELECT ta.C1
,ta.C2
,ta.C3
,ta.C4
FROM [TableA] ta
WHERE (SELECT COUNT(*)
FROM [TableA] ta2
WHERE ta.C2=ta2.C2
AND ta.C3=ta2.C3
AND ta.C4=ta2.C4)>1
实际上,在大多数情况下,这会更快:
SELECT *
FROM table ta1
JOIN table ta2 on ta1.id != ta2.id
WHERE ta1.c2 = ta2.c2 and ta1.c3 = ta2.c3 and ta1.c4 = ta2.c4
您加入具有相同值的不同行。我认为它应该有效。如我错了请纠正我。
Select * from tablename t1, tablename t2, tablename t3
where t1.C1 = t2.c2 and t2.c2 = t3.c3
似乎这样会起作用。虽然看起来不是一种有效的方式。
SELECT *
FROM my_table
WHERE column_a <=> column_b AND column_a <=> column_c
select t.* from table t
join (
select C2, C3, C4
from table
group by C2, C3, C4
having count(*) > 1
) t2
using (C2, C3, C4);
问题1:
SELECT DISTINCT a.*
FROM [Table] a
INNER JOIN
[Table] b
ON
a.C1 <> b.C1 AND a.C2 = b.C2 AND a.C3 = b.C3 AND a.C4 = b.C4
使用内部联接比子查询更有效,因为它需要更少的操作,并在比较值时保持索引的使用,从而允许SQL服务器在运行之前更好地优化查询。对此查询使用适当的索引可以将查询降低到仅n * log(n)行进行比较。
将子查询与where子句一起使用或仅执行C1不等于C2的标准连接会产生一个表,其中大约有2行与n行的幂进行比较,其中n是表中的行数。
因此,通过使用内部联接的正确索引,只返回符合连接条件的记录,我们能够大幅提高性能。另请注意,我们返回DISTINCT a。*,因为这将仅返回满足连接条件的表a的列。返回*将返回满足条件的a和b的列,并且不包括DISTINCT将导致每行的行与每行多次匹配另一行时重复。
也可以使用CROSS APPLY执行类似的方法,它仍然使用子查询,但更有效地利用索引。
使用关键字USING而不是ON的实现也可以工作,但是由于想要匹配C1不匹配的行,语法更复杂,因此您需要一个额外的where子句来过滤掉每一行的匹配本身。此外,在SQL的所有实现中,USING与表值不兼容/允许,因此最好坚持使用ON。
同样,问题2:
SELECT DISTINCT a.*
FROM [Table] a
INNER JOIN
[Table] b
ON
a.C1 <> b.C1 AND a.C4 = b.C4
这与1的查询基本相同,但因为它只想知道哪些行与C4匹配,所以我们只比较C4的行。
SELECT t1.* FROM table t1 JOIN table t2 ON t1.Id=t2.Id WHERE t1.C4=t2.C4;
为我提供准确的结果。
select * from test;
a1 a2 a3
1 1 2
1 2 2
2 1 2
select t1.a3 from test t1, test t2 where t1.a1 = t2.a1 and t2.a2 = t1.a2 and t1.a1 = t2.a2
a3
1
您也可以使用Joins尝试相同的事情。