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