繁体   English   中英

有条件地联接到SQL Server中的不同表

[英]Conditionally join to different tables in SQL Server

我们在两个不同的数据库中有两个具有相同架构的表。 我们有一项工作在运行并使用连接到这两个表中的一个或另一个的数据。 我们理想地希望做的(我知道这是不可能的)是:

SELECT
    *
FROM
    OtherData d
    IF (condition)
        INNER JOIN database1.Table t ON ...
    ELSE
        INNER JOIN database2.Table t ON ...

我们尝试构建一个将两个数据集合并并返回条件作为视图一部分的视图,因此我们可以选择条件为true的位置。 如果仅针对视图进行选择,则查询计划将显示它仅命中所需的数据库,而没有其他数据库。 但是,如果我们加入视图,则两者都进入。

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 ...重复大部分proc语句的语句)来编写此代码,以便在执行时我们只会命中所需的数据库,而不会尝试当我们知道要先击中哪个时,请同时访问两者。

您可以使用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

您可以使用登台表来简化存储过程。

伪SQL ...

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包进行任何类型的数据流处理,这也将使得有条件地访问不同的数据库(通过Control Flow)变得更加容易。

在这种情况下,动态SQL可能是最好的选择。

当然,当告诉人们使用动态SQL时,您必须随后参考该页面,其中描述了使用它的危害以及在必须使用它时如何保护自己。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM