2017-07-25 28 views
0

我已經描述了我喜歡有效的1個SQL查詢的場景。我試圖使用臨時表,但我發現自己沒有在哪裏。尋求專家意見。我使用SQL Server 2012的SQL通過加入有效處理2個表格

我有2代表的表A和表B中

Table A 
    ID TestName  

    Table B 
    ID TableAID LastUpdate 

TableAID在表B是表A的ID列

方案1:

Table A 
    ID TestName  
    1 Test 1  

    Table B 
    ID TableAID LastUpdate 

如果B表沒有任何記錄,然後將所有的表A記錄表B

場景2:

Table A 
    ID TestName  
    1 Test 1  

    Table B 
    ID TableAID LastUpdate 
    1 1 

如果表A具有記錄和表B中相匹配的記錄,那麼DONOT做任何動作

方案3:

Table A 
    ID TestName 
    1 Test 1 
    2 Test 2  

    Table B 
    ID TableAID LastUpdate 
    1 1 

如果表A具有記錄和不匹配在表B中插入表B

情況4:

Table A 
    ID TestName 


    Table B 
    ID TableAID LastUpdate 
    1 1 
    2 2 

如果表A沒有記錄,那麼所有的記錄

更新表B中的LASTUPDATE當前日期我」計劃有2個temprory表和使用除進行篩選匹配的記錄。但是我發現編寫高效的查詢很困難。

+0

方案4不應該發生,如果你正在使用外鍵也不會發生。 –

+0

表B中沒有外鍵引用。表A是計算輸出,可以視爲臨時表。 – Marid

回答

0

這似乎是一個完美的藉口使用MERGE命令

MERGE TableB b 
USING TableA a ON a.ID = b.TableAID 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT (TableAID) VALUES (a.ID) 
WHEN NOT MATCHED BY SOURCE 
    THEN UPDATE SET LastUpdate = GETDATE(); 
+0

'NOT MATCHED BY SOURCE' - 這是否意味着源表上沒有記錄?我懷疑你必須爲此添加另一個條件。 –

+0

@ZoharPeled否,表示:對於表B中未找到的TableB中的每個記錄。不是OP所要求的,但我猜想更可能需要什麼。如果TableA爲空,那就是TableB中的所有記錄,因此它可以在給定場景中運行。 –

+0

但是......沒有提到的場景 - 如果TableB有2條記錄,TableA有1條匹配記錄 - 是否需要更新其他TableB行。這會更新它。如果這不好,這個想法不會奏效。 –

0

對於方案1,2和3,在我看來,像你只需要一個左一個簡單的插入語句加入:

INSERT INTO [Table B] (TableAId) 
SELECT a.ID 
FROM [Table A] a 
LEFT JOIN [Table B] b ON a.ID = b.TableAId 
WHERE b.ID IS NULL 

注:我假設在Table BIDidentity,並且LastUpdate列可以爲空。

這將插入到表B存在於表A中的所有記錄,但不表B.

對於塞納里奧4,你需要一個更新語句:

UPDATE [Table B] 
SET LastUpdate = GETDATE() 
WHERE NOT EXISTS 
(
    SELECT 1 FROM [Table A] 
) 

我沒有看到方式爲您在單個查詢中執行所有4個方案。