具有多个条件的单列SQL筛选

时间:2016-02-25 18:46:31

标签: mysql sql

对SQL很新,我并不完全熟悉正确的语法。

我有一个包含一对多关系的列的表。我需要过滤列中的一个值,而不是其他值。

这是数据的样子:

| USER KEY | USER ID |
| ------   | ------- |
| 11672    |   SSO   |
| 11672    |   SSO   |
| 11672    |  DIRECT |
| 11203    |   SSO   |
| 11205    |   SSO   |
| 11206    |  DIRECT |

因此,您可以看到用户密钥可以同时具有SSO和DIRECT,或者仅具有SSO或仅具有直接。我需要过滤用户密钥,以便:

一个。包括只有DIRECT

的USER KEYS

B中。排除所有同时具有SSO和DIRECT

的USER KEYS

我从这个选择语句开始:

SELECT *
FROM USER_ID
WHERE USER_ID_TYPE = 'DIRECT'
OR (USER_ID_TYPE != 'SSO');

无论是否同时拥有SSO和DIRECT,这都会让我回复所有使用Direct的用户。我不知道语法是什么来过滤掉同时具有这两者的其他USER_KEY。我读过的大部分教程都非常基础,不要像这样深入到复杂的过滤中。

任何帮助都将不胜感激。

P

3 个答案:

答案 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

DEMO

答案 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')
相关问题