选择具有2列相等值的行

问题描述 投票:31回答:8

考虑下表

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行。

sql
8个回答
52
投票

问题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

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
投票
Select * from tablename t1, tablename t2, tablename t3 
where t1.C1 = t2.c2 and t2.c2 = t3.c3 

似乎这样会起作用。虽然看起来不是一种有效的方式。


2
投票
SELECT *
FROM my_table
WHERE column_a <=> column_b AND column_a <=> column_c

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);

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的行。


0
投票
SELECT t1.* FROM table t1 JOIN table t2 ON t1.Id=t2.Id WHERE t1.C4=t2.C4;

为我提供准确的结果。


-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尝试相同的事情。

© www.soinside.com 2019 - 2024. All rights reserved.