2017-07-25 63 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个方案。