示例:
Declare @Division int = 1
IF @Division = 1
BEGIN
SELECT * FROM A
END
ELSE IF @Division = 2
BEGIN
SELECT * FROM B
END
问题是,我不想使用if statements
,因为有数百个Divisions
要考虑。
这是一个较大查询的一部分,该查询已与其他表联接。
我该怎么做?
答案 0 :(得分:2)
如果表中的列完全相同,则可以执行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
答案 1 :(得分:1)
只需通过联盟在所有必需的表上创建视图
创建视图DivisionWiseData 如 开始 从tabA中选择*,1 AS部门 联盟 从tabB中选择*,2 AS Division 等等...
之后,只需使用 从dbo.DivisionWiseData中选择*,其中divisionid = @ divisionid