2017-05-08 40 views
0

我試圖選擇id其中代碼I對應於它,但我只想要那些id其中I是唯一對應的值。正確的id將是538具有其他code值以及I)。使用Oracle SQL。SQL - 選擇語句與額外(唯一)在需求

id code 
4 | G 
4 | O 
5 | I 
3 | G 
3 | I  
8 | G 
8 | I 
8 | O 
9 | G 
+0

請閱讀http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so - 當問一個問題/ 285557和接受的答案 –

+0

我的不好,我試圖擁有它作爲文本,但不明白如何在消息框中實現。如果從任何地方複製(excel,sql開發人員),它將作爲一行。嘗試使用換行符鍵入,然後換行符與跳過的行一起使用,這會佔用更大的空間。將來再試一次。謝謝! – Eug

+0

如果你在編輯你的問題時點擊小「幫助」按鈕,你會在這裏結束:http://stackoverflow.com/help/formatting它解釋了你必須格式化文本的所有選項 –

回答

3

你可以用聚集做到這一點:

select id 
from t 
group by id 
having min(code) = 'I' and max(code) = 'I'; 

如果code可以NULL,你需要另一個條件採取考慮到。

+0

''''而不是'5' – MatBailie

+0

@MatBailie。 。 。謝謝。 –

+0

看到這個答案與我對大型數據集的答案相比,性能如何是很有趣的。 –

0

該解決方案通過將表格左連接到自身上,使其與ID匹配,但代碼不同,並找到連接失敗的記錄。 這將在最SQLS工作,它可能需要一些調整您的口味

SELECT DISTINCT T0.* FROM [Table] AS T0 
LEFT JOIN [Table] AS T1 ON T0.ID = T1.ID AND T0.Code <> T1.Code 
WHERE T1.ID IS NULL AND T0.ID = 'I' 
+0

這個答案將返回重複的ID。 –

+0

我會加'AND T0.code ='我'... – MatBailie

+0

謝謝!該解決方案也可以工作,但我沒有提到示例表已經是多個連接的結果,比以前的解決方案需要更長的時間才能運行。 – Eug

0

@GordonLinoff方法很可能是最快的,但根據您的數據,還有其他替代方案具有不同的性能配置文件。

這第一個選項假設:
- 另一個表的所有獨特id值的存在
- 你的表有(id, code)

SELECT 
    primary.id 
FROM 
    primary -- the table with a unique list of your IDs 
WHERE 
    'I' = ALL (SELECT code FROM yourtable WHERE yourtable.id = primary.id) 

,第二個選項假定您的表有兩個索引的索引:
- (code, id)(對於發現確實有'I'代碼標識)
- (id, code)(對於發現如果這些ID有任何其他代碼)

(而且是基本相似@ZacFaragher答案。)

SELECT 
    code_i.id 
FROM 
    your_table code_i 
WHERE 
    code_i.code = 'I' 
    AND NOT EXISTS (SELECT * 
        FROM yourtable 
        WHERE yourtable.id = code_i.id 
         AND yourtable.code <> 'I' 
       ) 

這往往是值得嘗試不同的變化是不同的SQL引擎處理相關子查詢更好/更差等。