2017-10-02 4 views
0

ましょうsupose私は、次の表を持ってlist_level同じクエリで2つの基準と一致しないタプルを選択するにはどうすればよいですか?

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

私はタプルを取得するにはどうすればよい、NOT年= 2017年とNOT私は

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

しかし、そのクエリを試してみました= 2

CAT_IDで返信

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

は最後に、私はこのクエリwhith終わったが、私はそれは少し複雑だと思います。

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

このクエリを書くことができる他の方法はありますか?

答えて

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

興味深いです。私は第二の選択肢では決して考えなかっただろう。 – ceochronos

0
SELECT 
    * 
FROM 
    LIST_LEVEL 
WHERE 
YEAR <> '2017' 
AND NOT EXISTS(SELECT * FROM 
LIST_LEVEL 
WHERE CAT_ID IN(2) 
関連する問題