让我们假设我有下表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     |

如何获取不在year=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

我还有别的办法可以写这个查询吗?

最佳答案

我想你只是想:

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) ) ;

10-05 22:51
查看更多