T-Sql 多个自连接到 return 单个主值
T-Sql multiple self-Joins to return single main value
如果我有一个像下面这样的 table
| 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 行 D 来获得 A 这样我们就可以得到 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
谢谢,
尼克
类似下面的内容
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
如果我有一个像下面这样的 table
| 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 行 D 来获得 A 这样我们就可以得到 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
谢谢, 尼克
类似下面的内容
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