SQL通过联接有效地处理2个表

时间:2017-07-25 13:24:08

标签: sql performance sql-server-2012

我已经描述了我喜欢有效的1 SQL查询的场景。我试图使用临时表,但我发现自己没有。寻求专家意见。我使用的是SQL Server 2012。

我有2张表A和表B.

    Table A
    ID  TestName    

    Table B
    ID  TableAID LastUpdate 

表B中的TableAID是表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中的记录,那么就不要做任何动作

情景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表,并使用Except过滤匹配的记录。但我发现编写有效的查询很困难。

2 个答案:

答案 0 :(得分: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

注意:我假设ID中的Table B列是identity,并且LastUpdate列是为空的。

这将向表B中插入表A中但不在表B中的所有记录。

对于senario 4,您需要更新声明:

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

我没有看到您在单个查询中完成所有4种方案的方法。

答案 1 :(得分: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();