【问题标题】:Inner join then full join among the matched records匹配记录之间的内部连接然后完全连接
【发布时间】:2013-12-23 13:34:19
【问题描述】:

我有两张桌子:

declare @Table1 as table (id int, value CHAR(1))
declare @Table2 as table (id int, value CHAR(1))

INSERT @Table1
VALUES (1, 'A'),
(1, 'B'),
(3, 'A')

INSERT @Table2
VALUES(1, 'A'),
(1, 'C'),
(2, 'A')

我想加入这两个表,这样最后我应该能够产生这个结果:

id     value    id      value
1      A        1       A
1      B        NULL    NULL
NULL   NULL     1       C

我很抱歉解释不充分(我的意思是根本没有解释)。我在这里尝试做的是(类似于)为 id 列进行内部连接(我的意思是在“id”列上获取两组共有的记录)然后查看值列并在内部比较它们这个公共集合的边界。

我希望我能描述一下我想要做什么。

【问题讨论】:

  • 你想做什么? @Table1 中的 (3, 'A') 值去了哪里(或者为什么没有显示?)。或者另一种方式:为什么你显示 @Table1 中的 (1, 'B')@Table2 中不存在,但是 (3, 'A') 没有显示.... 没有真的很有意义。 .....
  • 他想做一个并排比较。那是我无法理解的。 1 A 在两个表中,因此并排显示; 1 B 仅在 @table1 上,但不在 table2 上...我认为他错过了 table1 中的 3 A
  • 我很抱歉解释不充分(我的意思是根本没有解释)。

标签: sql-server tsql join


【解决方案1】:

希望这会奏效

SELECT distinct t1_id as id, t1_value as value , t2_id as id , t2_value as value
FROM (SELECT t1.id as t1_id, t1.value as t1_value from @Table1  t1 INNER JOIN @Table2 t2 on t1.id = t2.id) as A 
        FULL OUTER JOIN 
     (SELECT  t2.id as t2_id, t2.value as t2_value  from @Table1  t1 INNER JOIN  @Table2 t2 on t1.id = t2.id) as B
    on A.t1_value = B.t2_value
ORDER BY t1_id desc

基本上,我正在做的是在内部集的值列上外部连接内部集(即 id 列上的内部连接)。

【讨论】:

    【解决方案2】:

    我赢了什么?

    SELECT c.id,c.value,d.id,d.value
    
    FROM
        @Table1 c
        full join
        @Table2 d 
            on c.id = d.id and c.value = d.value
    WHERE exists
            (
            SELECT a.id
                FROM
                    @Table1 a
                INNER JOIN
                    @Table2 b
                      ON a.id = b.id and a.id = c.id or d.id = a.id
    
            )
    

    【讨论】:

    • 在 SSMS 中工作正常。我注意到预览窗格仅显示 2 列
    • 您的工具似乎无法呈现相同名称的结果列 - 尝试使用别名
    【解决方案3】:

    您可以使用full outer join 通过预先过滤表格来做到这一点:

    select a.id as a_id, a.value as a_value,
           b.id as b_id, b.value as b_value
    from (select *
          from tablea a
          where a.id = 1
         ) a full outer join
         (select *
          from tableb b
          where b.id = 1
         ) b
         on a.id = b.id and a.value = b.value;
    

    【讨论】:

    • 这仅适用于 ID = 1 的记录,但不适用于两个表共有的记录,不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2021-06-24
    • 2017-12-21
    • 1970-01-01
    相关资源
    最近更新 更多