多列选择SQL问题:添加告警屏蔽条件后查询失效求助
问题分析与修复
表结构梳理
USERS表
| ID | ACCOUNT |
|---|---|
| 1 | 80001 |
| 2 | 90001 |
| 3 | 70001 |
FRIENDS表
| ID | ACCOUNT | TO_ACCOUNT |
|---|---|---|
| 1 | 80001 | 70001 |
ALERTS表
| ID | ACCOUNT | ALERT | ALERTID |
|---|---|---|---|
| 1 | 80001 | Hi | XD3000 |
ALERTS_BLOCKED表
| ID | ACCOUNT | ALERTID |
|---|---|---|
| 1 | 80001 | XD3000 |
失效原因
添加屏蔽条件后的SQL存在核心逻辑错误:
- 第二个查询块错误地用
ACCOUNT = '70001'过滤屏蔽告警,实际需求是当前用户(80001)屏蔽的告警需全部过滤,而非好友的屏蔽列表。 - 原SQL用
UNION拆分两次查询的写法冗余,导致逻辑重复且易出现条件不一致问题。
修复后的SQL
SELECT snd.ACCOUNT FROM ALERTS AS m JOIN USERS AS snd ON snd.ACCOUNT = m.ACCOUNT -- 获取当前用户及所有好友的账号集合 WHERE snd.ACCOUNT IN ( -- 当前用户账号 SELECT '80001' AS ACCOUNT UNION -- 所有好友的账号 SELECT TO_ACCOUNT FROM FRIENDS WHERE ACCOUNT = '80001' UNION SELECT ACCOUNT FROM FRIENDS WHERE TO_ACCOUNT = '80001' ) -- 过滤当前用户屏蔽的告警 AND m.ALERTID NOT IN ( SELECT ALERTID FROM ALERTS_BLOCKED WHERE ACCOUNT = '80001' );
逻辑说明
- 通过子查询一次性获取当前用户(80001)及所有好友的账号集合,避免拆分查询的冗余。
- 统一用当前用户的屏蔽列表过滤告警,确保所有关联告警中,只要是当前用户屏蔽的ID都不会被查询出来。
内容的提问来源于stack exchange,提问作者majo majo
相关产品推荐
相关产品推荐

