2014-01-14 105 views
1

創建和填充POC表的序列:返回第一匹配ID的條件

CREATE TABLE #POCSTBL (SCode varchar(10)) 
INSERT INTO #POCSTBL (SCode) 
SElECT 'LC13' 
UNION ALL 
SELECT 'LC22' 
UNION ALL 
SELECT 'LC31' 

CREATE TABLE #POCLUTBL (ID int Identity (1,1), LC1 varchar(10), LC2 varchar(10), LC3 varchar(10)) 

INSERT INTO #POCLUTBL (LC1, LC2, LC3) 
SELECT 'LC11',NULL,'LC13' 
UNION ALL 
SELECT 'LC21','LC13',NULL 
UNION ALL 
SELECT '-','LC31','LC33' 

SELECT * FROM #POCSTBL 
SELECT * FROM #POCLUTBL 

我的初步嘗試:

SELECT S.SCode, LU.ID FROM #POCSTBL S LEFT JOIN #POCLUTBL LU 
ON S.SCode = LU.LC1 OR S.SCode = LU.LC2 OR S.SCode = LU.LC3 

掉落#Tbls:

DROP TABLE #POCSTBL 
DROP TABLE #POCLUTBL 

所需的輸出:

SCode ID 
LC13 2 
LC22 NULL 
LC33 3 

我想先查找從#POCSTBL SCODE列反對#POCLUTBL的 LC2,一旦發現,採取ID作爲輸出, 如果沒有找到,那麼LC1,一旦發現,採取ID作爲輸出ID, 如果沒有找到ID,然後LC3,如果發現,採取ID作爲輸出, 如果沒有找到ID,然後在ID = NULL

謝謝

+0

#POCSTBL = POC源表 #POCLUTBLE = POC查找表 SCODE =源碼 LC(1/2/3)=查找列(1/2/3)......哦,這是我順便說一句誰想出了與這些名字。 :P – 007

+0

TIL:我需要變得更簡單,更少怪異。 Thx Aaron;) – 007

回答

1

像這樣:

SELECT 
    S.SCode, 
    COALESCE(L1.ID, L2.ID, L3.ID) As ID 
FROM  #POCSTBL S 
LEFT JOIN #POCLUTBL L1 ON S.SCode = L1.LC1 
LEFT JOIN #POCLUTBL L2 ON S.SCode = L2.LC2 
LEFT JOIN #POCLUTBL L3 ON S.SCode = L3.LC3 

假設有沒有LC1潛在的重複SCodes ,LC2或LC3。如果有可能,那麼你將需要一個更復雜的版本。

+0

這就像黑魔法... COALESCE =從(L1.ID,L2.ID,L3.ID)選項中獲得第一個非空值,多個LEFT連接背後的邏輯是什麼以及它們的連接條件? Thx這個真棒sln(我只是不完全得到它在我的生活中的這一點)。 – 007

+0

每個LEFT JOIN都擴展了基表的列集。 L1將與LC1匹配的所有'#POCLUTBL'行的行添加到SCode。 L2爲在LC2上匹配的行添加列,L3爲LC3匹配添加列。現在將所有可能的匹配值作爲addl列放在同一行中,COALESCE可以掃描*列*並找到第一個不爲NULL的列。 – RBarryYoung

+0

所以,如果我正確理解你,你正在創建3個相同的TBL #POCLUTBL實例並獲得多個發現。執行COALESCE獲取第一個非空值。我不知道你的查詢是如何跳過SCode的:LC13,ID:1? – 007