我已经描述了我喜欢有效的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过滤匹配的记录。但我发现编写有效的查询很困难。
答案 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();