我们在两个不同的数据库中有两个具有相同模式的表。我们有一个作业运行并使用连接到这两个表中的一个或另一个的数据。我们理想的做法(我知道不可能)是:
SELECT
*
FROM
OtherData d
IF (condition)
INNER JOIN database1.Table t ON ...
ELSE
INNER JOIN database2.Table t ON ...
我们尝试构建一个联合两个数据集的视图,并将条件作为视图的一部分返回,因此我们可以选择条件为真的位置。如果我们只是针对视图进行选择,则查询计划显示它只访问所需的数据库而不会转到另一个数据库。如果我们加入到视图中,它会同时出现。
CREATE VIEW View_Table AS
SELECT
1 AS Condition,
OtherData...
FROM...
database1.Table
UNION
SELECT
2 AS Condition,
OtherData...
FROM
database2.Table
GO
-- Then use it as:
SELECT
*
FROM
OtherData d
INNER JOIN View_Table vt ON vt.Condition = @Condition AND ...
因此,我们试图找出最好的方法(不仅仅是做巨大的IF ... ELSE ...复制我们的大部分过程的语句)来写这个,这样在执行中我们只会到达所需的数据库并且当我们知道要击中哪一个时,不要试图去找两个。
答案 0 :(得分:0)
您可以使用ISNULL
功能:
SELECT d.*,
ISNULL(T1.Field, T2.Field) Field
FROM OtherData d
LEFT JOIN database1.[Table] t1
ON d.Field = t1.Field AND (condition)
LEFT JOIN database2.[Table] t2
ON d.Field = t2.Field AND (condition)
或CASE
声明:
SELECT d.*,
CASE WHEN (condition)
THEN t1.Field
ELSE t2.Field
END Field
FROM OtherData d
LEFT JOIN database1.[Table] t1
ON d.Field = t1.Field
LEFT JOIN database2.[Table] t2
ON d.Field = t2.Field
答案 1 :(得分:0)
您可以使用临时表来简化存储过程。
... Pseudosql
truncate table stage.Table;
IF (condition)
select * into stage.Table from database1.Table where ...
ELSE
select * into stage.Table from database2.Table where ...
-- Then use it as:
SELECT
*
FROM
OtherData d
INNER JOIN stage.Table ON ...
恕我直言,我会尝试使用SSIS包进行任何类型的数据流,这也可以更容易有条件地命中不同的数据库(通过控制流)。
答案 2 :(得分:0)
动态SQL可能是您最好的选择。
当然,当告诉人们使用动态SQL时,您必须先参考描述使用它的危险的页面,以及在必须使用它时如何保护自己。