在SQL连接中过滤重复项

时间:2010-06-12 19:06:51

标签: sql mysql database join

使用SQL连接时,是否可以只保留左表有一行的行?

例如:

select * from A, B where A.id = B.a_id;

a1 b1
a2 b1
a2 b2

在这种情况下,我想删除除第一行以外的所有行,其中A中的一行恰好与B匹配1行。

我正在使用MySQL。

4 个答案:

答案 0 :(得分:4)

这应该适用于MySQL:

select * from A, B where A.id = B.a_id GROUP BY A.id HAVING COUNT(*) = 1;

对于那些不使用MySQL的人,你需要在所有列(除了A.id)之间使用聚合函数(如min()或max()),这样你的数据库引擎就不会抱怨。

答案 1 :(得分:0)

如果您在询问此类问题时指定表格的键,则会有所帮助。从你的例子中可以看出B的关键是什么(假设它有一个)。

这是一个可能的解决方案,假设ID是表B的候选键。

SELECT *
FROM A, B
WHERE B.id =
 (SELECT MIN(B.id)
  FROM B
  WHERE A.id = B.a_id);

答案 2 :(得分:0)

首先,我建议使用JOIN语法,而不是用逗号分隔表的过时语法。其次,如果A.id是表A的主键,那么您只需检查表B是否有重复项:

Select ...
From A
    Join B
        On B.a_id = A.id
Where Exists    (
                Select 1
                From B B2
                Where B2.a_id = A.id
                Having Count(*) = 1
                )

答案 3 :(得分:0)

这样可以避免计算匹配行的成本,这对于大型表来说可能很昂贵。

与往常一样,在比较各种可能的解决方案时,建议进行基准测试/比较执行计划。

select
  *
from
  A
  join B on A.id = B.a_id
where
  not exists (
    select
      1
    from
      B B2
    where 
      A.id = b2.a_id 
      and b2.id != b.id
  )