如何在不使用 If 语句的情况下根据值从 Table A 或 Table B SELECT
How to SELECT from either Table A or Table B based on a Value without using If statement
示例:
Declare @Division int = 1
IF @Division = 1
BEGIN
SELECT * FROM A
END
ELSE IF @Division = 2
BEGIN
SELECT * FROM B
END
问题是,我不想使用 if statements
,因为有数百个 Divisions
需要考虑。
这是连接到其他表的更大查询的一部分。
我该怎么做?
如果表具有完全相同的列,您可以执行 UNION ALL
:
declare @Division int = 1
SELECT * FROM A WHERE @Division = 1
UNION ALL
SELECT * FROM B WHERE @Division = 2
-- etc
或者如果它们没有完全相同的列,但可以从每个列中收集所有有趣的列,那么更广泛的版本可能会起作用:
SELECT COL1 as ID, COL2 as VALUE, COL3 as DESCR FROM A WHERE @Division = 1
UNION ALL
SELECT COL6 as ID, COL7 as VALUE, NULL as DESCR FROM B WHERE @Division = 2
-- etc
不过,与使用 IF
.
的初始版本相比,我不确定所有这些 效率如何
您也可以将其全部放入 CTE 中,以便与其他表轻松连接:
;WITH DivisionCTE (ID, VALUE, DESCR) AS
(
SELECT COL1 as ID, COL2 as VALUE, COL3 as DESCR FROM A WHERE @Division = 1
UNION ALL
SELECT COL6 as ID, COL7 as VALUE, NULL as DESCR FROM B WHERE @Division = 2
-- etc
)
SELECT *
FROM DivisionCTE x
INNER JOIN OtherTable y ON x.ID = Y.ID
-- etc
只需通过 Union
对所有必需的 table 创建视图
创建视图 DivisionWiseData
作为
开始
select *,1 AS 从 tabA 划分
联盟
select *,2 AS 从 tabB 划分
等等...
之后只需使用
select * 来自 dbo.DivisionWiseData 其中 divisionid=@divisionid
示例:
Declare @Division int = 1
IF @Division = 1
BEGIN
SELECT * FROM A
END
ELSE IF @Division = 2
BEGIN
SELECT * FROM B
END
问题是,我不想使用 if statements
,因为有数百个 Divisions
需要考虑。
这是连接到其他表的更大查询的一部分。
我该怎么做?
如果表具有完全相同的列,您可以执行 UNION ALL
:
declare @Division int = 1
SELECT * FROM A WHERE @Division = 1
UNION ALL
SELECT * FROM B WHERE @Division = 2
-- etc
或者如果它们没有完全相同的列,但可以从每个列中收集所有有趣的列,那么更广泛的版本可能会起作用:
SELECT COL1 as ID, COL2 as VALUE, COL3 as DESCR FROM A WHERE @Division = 1
UNION ALL
SELECT COL6 as ID, COL7 as VALUE, NULL as DESCR FROM B WHERE @Division = 2
-- etc
不过,与使用 IF
.
您也可以将其全部放入 CTE 中,以便与其他表轻松连接:
;WITH DivisionCTE (ID, VALUE, DESCR) AS
(
SELECT COL1 as ID, COL2 as VALUE, COL3 as DESCR FROM A WHERE @Division = 1
UNION ALL
SELECT COL6 as ID, COL7 as VALUE, NULL as DESCR FROM B WHERE @Division = 2
-- etc
)
SELECT *
FROM DivisionCTE x
INNER JOIN OtherTable y ON x.ID = Y.ID
-- etc
只需通过 Union
对所有必需的 table 创建视图创建视图 DivisionWiseData 作为 开始 select *,1 AS 从 tabA 划分 联盟 select *,2 AS 从 tabB 划分 等等...
之后只需使用 select * 来自 dbo.DivisionWiseData 其中 divisionid=@divisionid