2016-04-29 5 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 

Если за один раз передается только одно значение, я хотел бы получить значение A от COL1 , например Если @ value4 передается со значением «D», тогда я хотел бы получить A, присоединяясь к строке 3 D, чтобы мы могли получить C, который получает row2 C, получает B, который получает row1, который получает нас 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 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 
Смежные вопросы