[英]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時,您必須隨后參考該頁面,其中描述了使用它的危害以及在必須使用它時如何保護自己。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.