簡體   English   中英

sql排除某些結果

[英]sql excluding certain results

可以說我有一個數據集

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

如果B列中A列的值相同,則B列的值分別為1和2時,我如何排除B列的結果?

我希望我的結果看起來像這樣

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

在此顯式檢查值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的A值。
  2. 將那些值與表上的A值匹配。
  3. 如果子查詢中有A,則使用B = 2記錄。 如果不是,則使用B = 1記錄。

對於示例數據和所需結果,要獲得結果的最簡單查詢將是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 )。


或者,對於相同的示例數據,我們可以使用規范的更多文字實現返回相同的結果集。

要在A值相同的行包含2時排除行1 ,我們可以使用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
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
 )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM