[英]MySQL Join: Omit ALL repeating rows IF one row meets a condition
给定以下示例表
TABLE_A
-----
ID
-----
1
2
3
4
5
TABLE_B
---------------------------
TABLE_A_ID DETAIL
---------------------------
1 val_x
2 val_x
2 val_y
4 val_y
5 val_other
我在这两个表上进行左联接,并获得以下输出
-------------------------------
TABLE_A_ID DETAIL
-------------------------------
1 val_x
2 val_y
2 val_x
3 null
4 val_y
5 val_other
这是我从左联接中所期望的。
我的问题是,我也想删除具有行DETAIL
= val_y并具有重复的所有行TABLE_A_ID
如果组中的任何行有一个DETAIL
= val_y
所以我需要的输出是
-------------------------------
TABLE_A_ID DETAIL
-------------------------------
1 val_x
3 null
5 val_other
我尝试使用GROUP_BY TABLE_A_ID
和HAVING DETAIL != val_y
但这似乎不起作用。 我认为出于明显的原因,例如GROUP_BY
和HAVING
用于聚合并消除小于或大于对的值?
有没有办法在MySQL中做到这一点,还是我要求太多?
注意:这些是示例表。 它们不反映生产系统,因此不希望在问题和示例范围之外发表评论或回答-这只会使事情变得混乱。
SELECT sub1.id table_a_id, sub1.detail
FROM (
SELECT a.id, detail
FROM table_a a
LEFT JOIN table_b b on a.id = b.table_a_id) sub1
LEFT JOIN (
SELECT DISTINCT table_a_id
FROM table_b
WHERE detail = 'val_y') sub2
ON sub1.id = sub2.table_a_id
WHERE sub2.table_a_id IS NULL
sub2
子查询查找满足删除条件的所有ID。 然后将其与原始查询合并以过滤出这些ID。
您可以使用另一个LEFT JOIN
消除具有“ val_y”值的ID;
SELECT a.id as table_a_id, b1.detail
FROM table_a a
LEFT JOIN table_b b1 ON a.id = b1.table_a_id
LEFT JOIN table_b b2 ON a.id = b2.table_a_id AND b2.detail = 'val_y'
WHERE b2.detail IS NULL
要测试的SQLfiddle (已更新新的示例数据)
尝试这个:
SELECT b.table_a_id, b.detail
FROM table_a a JOIN table_b b ON a.id = b.id
GROUP BY b.table_a_id
HAVING COUNT( b.table_a_id ) == 1;
就像是
select * from table_b where table_a_id not in (
select TABLE_A_ID from TABLE_B where detail = 'val_y'
)
我认为以下将对您有帮助
Select a.ID ,b.Detail
From Table1 a
LEFT OUTER JOIN (SELECT id ,count(*) from Table2 group by id having count(*) =1 ) b
ON a.id = b.ID
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.