2016-04-29 34 views
0

如果我有像下面T-SQL的多個自聯接返回單個主值

| COL1 | COL2 | COL3 | COL4 | 
----------------------------- 
| A | B | *null* | *null* | 
| *null* | B | C | *null* | 
| *null* | *null* | C | D | 

而且我有一個存儲過程,可以採取四個參數,像這樣

CREATE PROCEDURE [dbo].[usp_Testing] 
    @value1 varchar(1) = NULL, 
    @value2 varchar(1) = NULL, 
    @value3 varchar(1) = NULL, 
    @value4 varchar(1) = NULL 

表如果一次只傳入一個值,我想從COL1 得到值A如果@ value4與值'D'一起傳遞,那麼我想通過自我加入第3行來獲得A,所以我們可以得到C獲得第2行C獲取使用B獲得第1行獲取我們A 目前,我執行類似(用手可能不會完全運行)這

DECALRE @use varchar(1) 
IF(@Value1 IS NOT NULL OR @Value2 IS NOT NULL) 
    SELECT TOP 1 @Use = COL1 FROM TAB t1 
    WHERE COL1 = @Value1 or COL2 = @Value2 
ELSE IF (@Value3 IS NOT NULL) 
    SELECT TOP 1 @Use = COL1 FROM TAB t1 
    INNER JOIN TAB t2 ON t1.COL2 = t2.COL2 
    WHERE COL3 = @Value3 
ELSE IF (@Value4) 
    SELECT TOP 1 @Use = COL1 FROM TAB t1 
    INNER JOIN TAB t2 ON t1.COL2 = t2.COL2 
    INNER JOIN TAB t3 ON t2.COL3 = t3.COL3 
    WHERE COL4 = @Value2 

這工作,但有沒有辦法讓這個更短? 我使用SQL Server 2012

感謝, 尼克

+0

在表中的空白空間頂部的NULL值或者你不關心這個查詢? – Caleth

+0

空格代表空值。對不起,不清楚。 –

回答

1

像下面

SELECT t1.col1, t1.col2, t2.col3, t3.col4 
FROM tab t1 
JOIN tab t2 ON t1.col2 = t2.col2 
JOIN tab t3 ON t2.col3 = t3.col3 
WHERE 
    COALESCE(@Value1, t1.col1) = t1.col1 AND 
    COALESCE(@Value2, t2.col2) = t2.col2 AND 
    COALESCE(@Value3, t3.col3) = t3.col3 AND 
    COALESCE(@Value4, t3.col4) = t3.col4 
GROUP BY t1.col1, t1.col2, t2.col3, t3.col4