有条件地加入SQL Server

时间:2015-09-09 18:06:32

标签: sql sql-server join

我们在两个不同的数据库中有两个具有相同模式的表。我们有一个作业运行并使用连接到这两个表中的一个或另一个的数据。我们理想的做法(我知道不可能)是:

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 ...复制我们的大部分过程的语句)来写这个,这样在执行中我们只会到达所需的数据库并且当我们知道要击中哪一个时,不要试图去找两个。

3 个答案:

答案 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时,您必须先参考描述使用它的危险的页面,以及在必须使用它时如何保护自己。

http://www.sommarskog.se/dynamic_sql.html

http://www.sommarskog.se/dyn-search.html