使用SQL连接时,是否可以只保留左表有一行的行?
例如:
select * from A, B where A.id = B.a_id;
a1 b1
a2 b1
a2 b2
在这种情况下,我想删除除第一行以外的所有行,其中A中的一行恰好与B匹配1行。
我正在使用MySQL。
答案 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
)