2016-12-06 28 views
0

,如果我有一個非常簡單的表:源碼 - 兩個記錄與某列不同的值存在,只能選擇某條記錄

id  outcome position 
--  ------- -------- 
1  TRUE   01 
2  TRUE   01 
2  FALSE   01 
2  TRUE   02 

其中兩個ID和位置可以跨多個記錄匹配;在這種情況下,我只想選擇FALSE結果,即當多個記錄中出現相同的ID和位置時。例如id = 1只有1條記錄,所以TRUE或FALSE在這裏可以。最後一條記錄的id = 2(與第2條和第3條記錄相同),但位置= 02,因此可以是TRUE或FALSE。但是因爲記錄2和3都共享相同的ID和位置,所以我只想選擇帶有錯誤結果的記錄。這應該是結果:c

id  outcome position 
--  ------- -------- 
1  TRUE   01 
2  FALSE   01 
2  TRUE   02 

我該怎麼做?我知道我可以創建一個表,然後做類似於

delete from mytable 
where exists 
(select a.* from mytable a 
join mytable b 
on a.id = b.id and a.position = b.position 
where a.outcome = TRUE) 

但是我寧願避免創建一個表並刪除記錄。我寧願想在第一個實例中選擇我想要的記錄。

+2

我看不出您的解釋如何與結果匹配。 –

+0

嗨戈登 - 基本上在兩個不同的記錄中ID和位置相同,結果列中的FALSE值需要覆蓋具有TRUE值的記錄。所以我真的只想選擇結果爲FALSE的記錄,給定初始條件。 – brucezepplin

+0

已編輯的問題澄清 – brucezepplin

回答

2

爲了得到只有一個輸出排爲id/position列的每個唯一組合,利用分組對這些列僅FALSE記錄將被退回。 要設置FALSE值的優先級,只需獲取組中的最小值:

SELECT id, 
     min(outcome) AS outcome, 
     position 
FROM MyTable 
GROUP BY id, position; 
+0

謝謝。非常簡單 - 踢我自己沒有想到這一點。 – brucezepplin

0

你似乎想要一個select。類似這樣的:

select t.* 
from mytable t 
where outcome = FALSE or (id = position); 

我不太遵循你真正想要的規則。

你可以把它變成視圖,因此,如果它是一個表,你可以訪問你想要的結果:

create view myview as 
    select t.* 
    from mytable t 
    where outcome = FALSE or (id = position); 
1

試試這個

SELECT * 
FROM Yourtable a 
WHERE NOT EXISTS (SELECT 1 
        FROM Yourtable b 
        WHERE a.id = b.id 
          AND a.position = b.position 
          AND a.outcome > b.outcome) 

按字母排序FALSE將被罰之前TRUE。所以,當有特定id和'位置二者結合TRUEFALSE

相關問題