2016-04-29 1 views
0

Si j'ai une table comme ci-dessousT-Sql multiples Autojointures pour retourner la valeur principale unique

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

Et j'ai une procédure stockée qui peut prendre quatre paramètres comme si

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

Si seulement une seule valeur est transmise à la fois je voudrais obtenir la valeur A de COL1 par exemple Si @ value4 est passé avec la valeur 'D', alors je voudrais obtenir A en auto-joignant la ligne 3 D afin que nous puissions obtenir C qui obtient row2 C utilise B qui obtient row1 qui nous obtient A Actuellement je fais quelque chose comme (Witten main donc pourrait ne pas fonctionner pleinement) cette

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 

cela fonctionne, mais est-il un moyen de faire ce court? J'utilise sql server 2012

Merci, Nick

+0

sont les espaces vides dans la table au NULLs haut ou les valeurs que vous ne se soucient pas de cette question? – Caleth

+0

Les espaces vides représentent les valeurs nulles. Désolé, ce n'était pas clair. –

Répondre

1

Quelque chose comme ce qui suit

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