对SQL很新,我并不完全熟悉正确的语法。
我有一个包含一对多关系的列的表。我需要过滤列中的一个值,而不是其他值。
这是数据的样子:
| USER KEY | USER ID |
| ------ | ------- |
| 11672 | SSO |
| 11672 | SSO |
| 11672 | DIRECT |
| 11203 | SSO |
| 11205 | SSO |
| 11206 | DIRECT |
因此,您可以看到用户密钥可以同时具有SSO和DIRECT,或者仅具有SSO或仅具有直接。我需要过滤用户密钥,以便:
一个。包括只有DIRECT
的USER KEYSB中。排除所有同时具有SSO和DIRECT
的USER KEYS我从这个选择语句开始:
SELECT *
FROM USER_ID
WHERE USER_ID_TYPE = 'DIRECT'
OR (USER_ID_TYPE != 'SSO');
无论是否同时拥有SSO和DIRECT,这都会让我回复所有使用Direct的用户。我不知道语法是什么来过滤掉同时具有这两者的其他USER_KEY。我读过的大部分教程都非常基础,不要像这样深入到复杂的过滤中。
任何帮助都将不胜感激。
P
答案 0 :(得分:3)
您的查询针对单行执行两项测试,而不是针对具有相同USER_KEY
的所有行执行测试。你需要这样的东西:
SELECT *
FROM USER_ID AS u1
WHERE USER_ID_TYPE 'DIRECT'
AND NOT EXISTS (
SELECT *
FROM USER_ID AS u2
WHERE u1.USER_KEY = u2.USER_KEY
AND u2.USER_ID_TYPE = 'SSO')
或等效的LEFT JOIN
SELECT u1.*
FROM USER_ID AS u1
LEFT JOIN USER_ID AS u2 ON u1.USER_KEY = u2.USER_KEY AND u2.USER_ID_TYPE = 'SSO'
WHERE u1.USER_ID_TYPE = 'DIRECT'
AND u2.USER_KEY IS NULL
答案 1 :(得分:1)
您也可以使用某些聚合来实现所需的结果
select USER_KEY
from USER_ID
group by USER_KEY
having sum(USER_ID_TYPE = 'DIRECT') > 0
and sum(USER_ID_TYPE = 'SSO') = 0
答案 2 :(得分:0)
SELECT *
FROM USER_ID U
WHERE USER_ID_TYPE = 'DIRECT'
AND NOT EXISTS
(SELECT 1 FROM USER_ID UsubQ WHERE U.USER_ID_KEY = UsubQ.USER_ID_KEY
AND USER_ID_TYPE = 'SSO')