2011-03-03 53 views
1

我有一個查詢返回多個記錄,這些記錄成對出現。記錄對列中的一些信息與前面的ID和年份相同,但其他信息具有不同的值,前列名稱類型可能爲空,另一個爲'A'。SQL幫助省略記錄

如果第三列類型等於'A'或其中一個對的另一個任意字符串,我該如何去排除SQL查詢的WHERE部分中具有相同ID和年份的記錄?我在想一個案例陳述可能會被使用,但我不確定。

+0

是的,你可以使用大小寫,並在最後過濾,如果你提供一些樣本,我們可以給你更準確的答案 –

回答

1

您可以使用NOT EXISTS和子查詢...

SELECT id, year 
FROM table t 
WHERE NOT EXISTS (SELECT * FROM table t2 
        WHERE ThirdColumn = 'A' 
        AND t2.id = t.id 
        AND t2.year = t.year) 
+0

,這將導致(2)表掃描,不是非常優化的解決方案 –

+0

可以有超過2相同的ID,比如說可以有8個,但每年只能返回2個,所以每年有2個相同的ID。如果我這樣做,那麼其他年份的所有其他ID也不會被退回,我怎麼能在年份和ID都包括在內呢?我將需要將此語句移植到水晶語法,但現在只需獲取SQL查詢將啓動我。 –

+0

@ K Ivanov - 如果他沒有這些領域的索引,那麼有更大的問題... – JNK

0

並非如此簡單。

select t.* 
from tbl t 
left join (
    select t2.id, t2.year 
    from tbl t2 
    group by t2.id, t2.year 
    having count(*) > 1 and 
     count(case when type='A' then 1 end) * 
     count(case when type='A' then null else 1 end) > 0 
) X 
    on X.id = t.id and X.year = t.year 
WHERE X.id is null 
  • count(*) > 1有助於我們認爲那裏是至少具有相同ID的一對/年
  • 的2 count(case..) > 0■確定說,「type S的至少一個是‘A’,並在至少一個不
  • LEFT JOIN + WHERE IS NULL是一個典型的技術只顯示在左連接失敗的數據,即ID /符合子查詢的條件,對年度取出