如何选择在同一查询中不匹配两个标准的元组?

时间:2017-10-02 18:54:33

标签: sql postgresql

让我知道我有下表list_level

| year | cat_id | user_id |  id  | val_1 | val_2  |
|------|--------|---------|------|-------|--------|
| 2017 |      2 |  141256 | 1501 | ABC   | <null> |
| 2017 |      2 |  141256 | 1023 | DRF   | <null> |
| 2017 |      1 |  141256 |  882 | TGV   | 100    |
| 2016 |      2 |  141256 |  801 | ADG   | 90     |
| 2016 |      1 |  141256 |  590 | IKM   | 100    |
| 2016 |      1 |  141256 |  480 | EGM   | 87     |
| 2015 |      2 |  141256 |  256 | YHX   | 70     |
| 2015 |      1 |  141256 |  132 | QWE   | 68     |

如何获取元组不是年份= 2017而不是cat_id = 2

我试过

SELECT
  *
FROM
  LIST_LEVEL
WHERE
 YEAR <> '2017'
 AND CAT_ID NOT IN (2) 

但该查询返回

| year | cat_id | user_id |  id  | val_1 | val_2  |
|------|--------|---------|------|-------|--------|
| 2016 |      1 |  141256 |  590 | IKM   | 100    |
| 2016 |      1 |  141256 |  480 | EGM   | 87     |
| 2015 |      1 |  141256 |  132 | QWE   | 68     |

我需要这个结果集

| year | cat_id | user_id |  id  | val_1 | val_2  |
|------|--------|---------|------|-------|--------|
| 2017 |      1 |  141256 |  882 | TGV   | 100    |
| 2016 |      2 |  141256 |  801 | ADG   | 90     |
| 2016 |      1 |  141256 |  590 | IKM   | 100    |
| 2016 |      1 |  141256 |  480 | EGM   | 87     |
| 2015 |      2 |  141256 |  256 | YHX   | 70     |
| 2015 |      1 |  141256 |  132 | QWE   | 68     |

最后,我结束了这个查询,但我觉得它有点复杂。

SELECT 
  *
FROM (
    SELECT
      *
    FROM
      LIST_LEVEL
    WHERE
      YEAR <> '2017'
    UNION
    SELECT
      *
    FROM
      LIST_LEVEL
    WHERE
      CAT_ID NOT IN (2) 
) T      

我可以用其他方式编写此查询吗?

2 个答案:

答案 0 :(得分:3)

我想你只想要or

SELECT ll.*
FROM LIST_LEVEL ll
WHERE ll.YEAR <> '2017' OR CAT_ID NOT IN (2) ;

或者,如果您愿意:

WHERE NOT (ll.YEAR = '2017' AND CAT_ID IN (2) ) ;

答案 1 :(得分:0)

SELECT
  *
FROM
  LIST_LEVEL
WHERE
 YEAR <> '2017'
 AND NOT EXISTS(SELECT * FROM
 LIST_LEVEL
WHERE CAT_ID IN(2)