2016-12-29 234 views
0

可以說,我具有SQL排除某些結果

A B 
-- -- 
a 1 
b 1 
c 1 
d 1 
d 2 
e 1 
f 1 
f 2 
g 1 

的數據組如何將我排除在第1列B中的結果,如果B列同時具有圖1和2的值在列中的相同的值一個?

我想我的結果看起來像這樣

A B 
-- -- 
a 1 
b 1 
c 1 
d 2 
e 1 
f 2 
g 1 
+1

最有可能你會使用'EXISTS'。 –

+0

是1,2固定值?我們可以有3個嗎? – sumit

回答

0

檢查明確這裏的值1和2以及使用的事實,恰好有兩個。如果可以安全地假定你總是想要最高價值,那麼你可能會使這個問題變得不那麼麻煩。

select 
    tbl.A, 
    tbl.B 
from 
    Table1 tbl 
    left outer join (
    select 
     A 
    from 
     Table1 
    where 
     B in (1,2) 
    group by 
     A 
    having 
     count(B) = 2 
) mlt on tbl.A = mlt.A 
where 
    (
    mlt.A is not null 
    and tbl.B = 2 
) or (
    mlt.A is null 
    and tbl.B = 1 
) 
  1. 圖出同時具有1和2
  2. 匹配表上的A值的所有的A值。
  3. 如果A在子查詢中,則使用B = 2記錄。如果不是,請使用B = 1記錄。
0

對於示例數據和期望的結果,最簡單的查詢來實現結果將是一個GROUP BY操作和一個聚合函數。

SELECT d.A 
     , MAX(d.B) AS B 
    FROM my_data_set d 
    GROUP BY d.A 
    ORDER BY d.A 

如果我們只在B列有12行有興趣,我們可以添加一個WHERE條款

SELECT d.A 
     , MAX(d.B) AS B 
    FROM my_data_set d 
    WHERE d.B IN (1,2) 
    GROUP BY d.A 
    ORDER BY d.A 

與示例數據,輸出是一樣的。

這兩個語句都達到了指定的結果。 (目前爲A每個不同的值只有返回行。)


或者,相同的數據。例如,我們可以返回相同的結果具有更字面實施規範設置。

要排除1行時存在與2一排的A相同的值,我們可以使用一個NOT EXISTS謂詞和相關子查詢。

SELECT d.A 
     , d.B 
    FROM my_data_set d 
    WHERE (d.B = 2) 
    OR (d.B = 1 AND 
      NOT EXISTS (SELECT 1 
          FROM my_data_set e 
          WHERE e.A = d.A 
          AND e.B = 2 
         ) 
     ) 
    ORDER BY d.A, d.B 
+0

慣於這項工作中的數據集下方的,1個 B,1個 C,1 d,1 d,2 E,1個 F,1- 樓2 克,1層 樓3 – sumit

+0

@sumit:正如我在答覆開始時所說的,我的建議適用於問題中給出的「*示例數據和期望結果*」。你非常正確地指出,給定一個不同的數據集,查詢的返回將會不同。 (實際上,在我的答案中,第二個查詢將返回給定註釋中提出的數據集的答案中指定的結果。)在給定不同數據集時,在問題中沒有明確指出(它含糊不清)什麼結果應該返回。 – spencer7593

0
select 
* from tbl where a IN 
(

select 

a from tbl 
group by a 
having count(*)>1 
) 
and b!=1 

UNION ALL 

select 
* from tbl where a IN 
(

select 

a from tbl 
group by a 
having count(*)=1 
)