请考虑以下表格
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行。
答案 0 :(得分:53)
问题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
答案 1 :(得分:6)
实际上,在大多数情况下这会更快:
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
您加入具有相同值的不同行。我认为它应该有效。如果我错了,请纠正我。
答案 2 :(得分:2)
Select * from tablename t1, tablename t2, tablename t3
where t1.C1 = t2.c2 and t2.c2 = t3.c3
似乎这样会起作用。虽然看起来不是一种有效的方式。
答案 3 :(得分:2)
SELECT *
FROM my_table
WHERE column_a <=> column_b AND column_a <=> column_c
答案 4 :(得分:0)
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);
答案 5 :(得分:0)
问题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的行。
答案 6 :(得分:0)
SELECT t1.* FROM table t1 JOIN table t2 ON t1.Id=t2.Id WHERE t1.C4=t2.C4;
为我提供准确的结果。
答案 7 :(得分:-1)
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尝试相同的事情。