微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 mysql UNION 中,我可以从右侧部分的左侧部分排除行

如何解决在 mysql UNION 中,我可以从右侧部分的左侧部分排除行

我有一张表,用于存储个人或组的记录。

|id|entity_id|person_id|group_id|
|1 |000000001|999999999|NULL    |
|2 |000000001|NULL     |88888888|
|3 |000000002|999999999|NULL    |
|4 |000000003|NULL     |88888888|

如何获取person_id 999999999和group_id 88888888的所有记录,但后者仅当我没有entity_id 000000001的person_id 999999999的记录时

所以我的结果应该是

|id|entity_id|person_id|group_id|
|1 |000000001|999999999|NULL    |
|3 |000000002|999999999|NULL    |
|4 |000000003|NULL     |88888888|

我希望这在一个查询中是可能的,但 UNION,EXCEPT 似乎并不能解决问题。

我正在尝试类似的东西

SELECT *
from myTable m1
WHERE NOT IS NULL person_id
UNION ALL
SELECT *
from myTable m2
WHERE NOT IS NULL group_id
EXCEPT (SELECT entity_id FROM m1)

但显然MysqL不支持EXCEPT

解决方法

使用NOT EXISTS

SELECT t1.*
FROM tablename t1
WHERE t1.person_id = '999999999'
   OR (
     t1.group_id = '88888888' 
     AND NOT EXISTS (SELECT 1 FROM tablename t2 WHERE t2.entity_id = t1.entity_id AND t2.person_id = '999999999')
   )

参见demo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。