簡體   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