首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL通过Joins高效地处理2个表

SQL通过Joins高效地处理2个表
EN

Stack Overflow用户
提问于 2017-07-25 13:24:07
回答 2查看 35关注 0票数 0

我描述了我希望有一个高效的1SQL查询的场景。我试过用临时的桌子,但我发现自己找不到地方。寻求专家意见。我正在使用Server 2012。

我有两张表A和表B。

代码语言:javascript
复制
    Table A
    ID  TestName    

    Table B
    ID  TableAID LastUpdate 

表B中的TableAID是表A的ID列。

设想1:

代码语言:javascript
复制
    Table A
    ID  TestName    
    1   Test 1      

    Table B
    ID  TableAID LastUpdate 

如果表B没有任何记录,则将所有表A记录插入表B

设想2:

代码语言:javascript
复制
    Table A
    ID  TestName    
    1   Test 1      

    Table B
    ID  TableAID LastUpdate
    1   1 

如果表A有记录并与表B中的记录匹配,则不要做任何操作

设想3:

代码语言:javascript
复制
    Table A
    ID  TestName 
    1   Test 1  
    2   Test 2      

    Table B
    ID  TableAID LastUpdate
    1   1 

如果表A的记录与表B中的记录不匹配,则插入表B

设想4:

代码语言:javascript
复制
    Table A
    ID  TestName


    Table B
    ID  TableAID LastUpdate
    1   1
    2   2 

如果表A没有记录,则更新表B中LastUpdate中所有记录的当前日期

我计划有两个临时表和使用,除了过滤匹配的记录。但是我发现很难编写一个高效的查询。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-25 13:37:18

这似乎是使用合并命令的完美借口。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-07-25 13:36:17

对于场景1、2和3,在我看来,您只需要一个带有左联接的简单insert语句:

代码语言:javascript
复制
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,您需要一个更新语句:

代码语言:javascript
复制
UPDATE [Table B]
SET LastUpdate = GETDATE()
WHERE NOT EXISTS
(
    SELECT 1 FROM [Table A]
)

我看不出有什么方法可以让您在一个查询中完成所有4种场景。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45304706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档