如果没有巧合,如何加入两张桌子?

时间:2018-05-27 15:57:52

标签: sql sql-server join

我想要加入两个表。我尝试了通常的左右连接,但都没有给出我想要的结果。

表A

ID_A     VALUE_A
-----------------
A           1     
B           2     

表B

ID_B   ID_A    VALUE_B
-------------------------
90       A        1
90       C        1
90       E        1  
91       A        1
91       B        1
92       B        1
92       E        1
92       F        1

我想得到这个结果:

ID_A   VALUE_A     ID_B     ID_A   VALUE_B 
-------------------------------------------------
A        1          90        A       1 
B        2          90        NULL    NULL 
A        1          91        A       1 
B        2          91        B       1
A        1          92        NULL    NULL
B        2          92        B       1

4 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望第一个表格中id_avalue_a的所有组合以及第二个表格中的所有不同id_b组合。如果是这样的话:

select iv.id_a, iv.value_a, ib.id_b, b.id_a, b.value_b
from (select distinct id_a, value_a from a) iv cross join
     (select distinct id_b from b) ib left join
     b
     on b.id_b = ib.id_b and b.id_a = iv.id_a;

cross join生成行。 left join会带来其他列。

答案 1 :(得分:1)

试试这个:

SELECT A.ID_A , A.VALUE_A , B.ID_B , B.ID_A , B.VALUE_B
  FROM            TABLE_A A
  LEFT OUTER JOIN TABLE_B B
   ON A.ID_A = B.ID_A ;

编辑:使用粘贴位注释后错别字(谢谢!!)。

答案 2 :(得分:1)

我通常将这样的事情分解为CTE:

DDL

use tempdb

CREATE TABLE Table1
    ([ID_A] varchar(1), [VALUE_A] int)
;

INSERT INTO Table1
    ([ID_A], [VALUE_A])
VALUES
    ('A', 1),
    ('B', 2)
;


CREATE TABLE Table2
    ([ID_B] int, [ID_A] varchar(1), [VALUE_B] int)
;

INSERT INTO Table2
    ([ID_B], [ID_A], [VALUE_B])
VALUES
    (90, 'A', 1),
    (90, 'C', 1),
    (90, 'E', 1),
    (91, 'A', 1),
    (91, 'B', 1),
    (92, 'B', 1),
    (92, 'E', 1),
    (92, 'F', 1)
;

答案

with a as (
        select distinct id_b
        from Table2
),
b as (
        select  id_a, value_a, id_b
        from    Table1 cross join a
)
select  b.id_a, b.value_a, b.id_b, t2.id_a, t2.value_b
from    b left join Table2 t2
        on b.id_a = t2.id_a
        and b.id_b = t2.id_b

结果

+------+---------+------+------+---------+
| id_a | value_a | id_b | id_a | value_b |
+------+---------+------+------+---------+
| A    |       1 |   90 | A    | 1       |
| B    |       2 |   90 | NULL | NULL    |
| A    |       1 |   91 | A    | 1       |
| B    |       2 |   91 | B    | 1       |
| A    |       1 |   92 | NULL | NULL    |
| B    |       2 |   92 | B    | 1       |
+------+---------+------+------+---------+

答案 3 :(得分:1)

我无法解决确切的逻辑,无法完全按照预期匹配结果,但假设你想得到类似的结果:

SELECT a.ID_A, COALESCE(a.VALUE_A,b.VALUE_B) VALUE_A, b.ID_B, a.ID_A, 
       (CASE WHEN a.ID_A IS NULL THEN a.ID_A ELSE CAST(b.VALUE_B as VARCHAR(1)) END) 
       as VALUE_B
  FROM TABLE_A a FULL OUTER JOIN TABLE_B b 
  ON ( a.ID_A = b.ID_A )
 GROUP BY a.ID_A, a.VALUE_A, b.ID_B, a.ID_A, b.VALUE_B 
 ORDER BY 3, 2, 1;

SQL Fiddle Demo