2015-05-14 79 views
1

假設我有這樣的數據在一個表:條件自加入

Trade Id | Source 
----------------- 
x  | LCH  
x  | Commodore 
y  | LCH   
z  | Commodore 

我想這樣的輸出:

x | LCH   
y | LCH   
z | Commodore 

含義,如果有任何「LCH」條目對於一個給定貿易ID,這將優先。

我可以在Java或任何其他編程語言中輕鬆完成此操作,方法是在加入表格後獲取基本結果,然後使用映射等對其進行過濾,但由於性能原因,我們希望使用第一名。

請你看看,讓我知道如果有任何SQL解決方案。

+1

什麼是您使用DBMS的味道? –

+1

只有兩個值'LCH'和'Commodore'?如果不是,那麼你能否更新你的樣本數據和預期的輸出結果...... ---你是否想爲每個'Trade_id'設置一行,並且相應的'source'將遵循你的規則? OR ---是否想從結果集中排除這些行,其中有一個條目與'LCH'存在? –

+0

@MaheswaranRavisankar它的DB2 –

回答

1

我們必須遵循分而治之邏輯。

讓我們先來顯示所有的trade_id的與source = 'LCH'

SELECT Trade_id,Source 
FROM your_table 
WHERE Source='LCH' 

現在,我們要拉對方trade_id的不具有LCH源!在這裏我使用相同的NOT EXISTS

SELECT Trade_id,Source 
FROM your_table a 
WHERE NOT EXISTS 
(SELECT 'X' FROM your_table b 
    WHERE a.Trade_id = b.Trade_id 
    AND b.Source = 'LCH') 

現在,我們已經提取出我們想要的所有行,因此我們兩者都做結果集UNION(Set操作)。

SELECT Trade_id,Source 
FROM your_table 
WHERE Source='LCH' 
UNION ALL 
SELECT Trade_id,Source 
FROM your_table a 
WHERE NOT EXISTS 
(SELECT 'X' FROM your_table b 
    WHERE a.Trade_id = b.Trade_id 
    AND b.Source = 'LCH') 
+0

避免代碼只有答案。添加一些關於解決方案的描述 – ughai

+0

該SQL是自描述性的。並且仍然向SQL添加描述需要很多文本。你可以廣泛地看到這麼多的答案!你也可以看到我的回答歷史記錄的任何描述的帖子... –

+0

從[Meta](http://meta.stackexchange.com/questions/148272/is-there-any-benefit-to-allowing-code- only-answers-while-blocking-code-only-ques) - 雖然只有代碼的答案才能讓問問題的人通過他們可能面臨的任何障礙,但這並不會影響他們,或者未來的訪問者在很長時間內跑。 我們一直都在吹捧我們不是代碼工廠。我們是教別人釣魚的人。僅有代碼的答案只能爲一天的人提供食物。 – ughai

0

試試這個:

select * from table where source = 'LCH' 
Union 
select * from table where source <> 'LCH' and trade_id not in (select * from table where source = 'LCH' 
) 
1

這是一個窗聚合函數任務,無需聯接:

SELECT Trade_id, Source 
FROM 
(
    SELECT Trade_id, Source, 
     ROW_NUMBER() 
     OVER (PARTITION BY Trade_id 
      ODER BY CASE WHEN Source = 'LCH' THEN 0 ELSE 1 END) AS rn 
    FROM your_table 
) AS dt 
WHERE rn = 1 
0
SELECT [Trade Id],Source 
FROM table1 
WHERE Source = 'LCH' 
Union 
SELECT [Trade Id],Source 
FROM table1 
WHERE Source<> 'LCH' 
AND [Trade Id] NOT IN (SELECT [Trade Id] FROM table1 WHERE Source= 'LCH')