2017-09-15 96 views
-1

我們有ID表如下從組合SQL選擇從多值一個值

id | newsecid 
--- | --- 
1 | 10 
2 | 20 
3 | 30 

單ID將有單newsecid

其他表的壯舉

id | featid 
--- | --- 
1 | 5 
1 | 6 
2 | 2 
2 | 4 

一個ID可以有多個專長ID

參考表

newsecid | featid | oldsecid 
---  | ---  | --- 
6   | null | 2 
2   | null | 6 
3   | null | 5 
1   | NULL | 1 
1   | 5  | 4 
16  | NULL | 16 
16  | 4  | 13 
25  | NULL | 26 
25  | 6  | 25 
26  | NULL | 26 
26  | 6  | 24 

當有對同一ID的多個featids的,我們把它們看成空與裁判桌

對於所有newsecids加入沒有必要的newsecid組合和featid得到oldsecid從ref表中,因爲總是隻有一個值,比如在newsecids的情況下,6,2和3的featid爲null。

但是,對於只有newsecids 1,16,25,26,我們必須從ref表中的newsecid和featid的組合中選擇oldsecid,因爲有2個值。一個爲空featid,另一個爲一些featid值。

其中對於組合沒有要求我使用

select c.oldsecid from id i 
inner join feat f on i.id=f.id 
inner join ref c on i.newsecid = c.newsecid 

使用這個我從裁判表中獲取oldsecid 2,6,5由於只有一個值的情況下。

對於使用上述查詢的情況1,16,25,26,我得到了隨機的oldsecid。在此我需要那個fesetid不爲null的oldsecid。

我們可以將newsecid的條件硬編碼爲1,16,25,26,因爲我不只有這些情況。

任何幫助

+1

'Id'是一個可怕的表名... – jarlh

+0

@jarlh:就一個例子 – Remon

回答

0

按我的理解,嘗試:

select c.oldsecid from id i 
inner join feat f on i.id=f.id 
inner join ref c on i.newsecid = c.newsecid 
Inner join(select newSecId,count(*) as newSecIdCount from ref group by newSecId) r on r.newSecId=i.newSecId 

Where (r.newSecIdCount=1 or c.feetid is not null)