我描述了我希望有一个高效的1SQL查询的场景。我试过用临时的桌子,但我发现自己找不到地方。寻求专家意见。我正在使用Server 2012。
我有两张表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中所有记录的当前日期
我计划有两个临时表和使用,除了过滤匹配的记录。但是我发现很难编写一个高效的查询。
发布于 2017-07-25 13:37:18
这似乎是使用合并命令的完美借口。
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();发布于 2017-07-25 13:36:17
对于场景1、2和3,在我看来,您只需要一个带有左联接的简单insert语句:
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 B中的ID列是identity,而LastUpdate列是可空的。
这将在表B中插入表A中的所有记录,但不插入表B中的所有记录。
对于senario 4,您需要一个更新语句:
UPDATE [Table B]
SET LastUpdate = GETDATE()
WHERE NOT EXISTS
(
SELECT 1 FROM [Table A]
)我看不出有什么方法可以让您在一个查询中完成所有4种场景。
https://stackoverflow.com/questions/45304706
复制相似问题