连接来自两个不同表的两列

Posted

技术标签:

【中文标题】连接来自两个不同表的两列【英文标题】:Join two columns from two different tables 【发布时间】:2011-04-18 19:16:08 【问题描述】:

我在时遇到问题。

场景是:我有一个有 11 列的表 A 和另一个有 6 列的表 B。

两个表中都有一个列名 SAMPLE1。但是,来自第一个表 A 的 SAMPLE2 和来自第二个表 B 的 ABC 具有相同的值但具有不同的列名。与 SAMPLE3 和 DEF 相同。现在我想将这些列连接到一个列(由两个表中的数据组成),其余列也应该出现在最终表上。

例子:

表 A

SAMPLE1    SAMPLE2    SAMPLE3 .........SAMPLE 11 (Total 11 columns in this table)
 
 US          75.2       US1_US           NULL

 INDIA       71         I3_INDIA         NULL

 UK          1851.23    UK1_UK           NULL

表 B

SAMPLE1      ABC         DEF............. XYZ (Total 6 columns in this table)

CHINA        123.2       C1_CHINA         2

JAPAN        1.1         J1_JAPAN         2

GERMANY      10.2314     G1_GERMANY       2

SINGAPORE    100.22      S1_SINGAPORE     2

现在我想看到这样的输出:

SomeTable

SAMPLE1      SOMENAME1    SOMENAME2..SAPMLE 11   ABC    DEF .....  SOMENAME3   
  
   US         75.2        US1_US      NULL       NULL    NULL      NULL

   INDIA      71          I3_INDIA    NULL       NULL    NULL      NULL 

   UK         1851.23     UK1_UK      NULL       NULL    NULL      NULL 

   CHINA      123.2       C1_CHINA    NULL       NULL    NULL       2   

   JAPAN      1.1         J1_JAPAN    NULL       NULL    NULL       2 

   GERMANY    10.2314     G1_GERMANY  NULL       NULL    NULL       2   

   SINGAPORE  100.22     S1_SINGAPORE NULL       NULL    NULL       2 

简而言之:

选择 (样品 1(来自表 A)+ 样品 1(来自表 B))作为样品 1, (SAMPLE2 + ABC) 作为 SOMENAME1, (SAMPLE3 + DEF) 作为 SOMENAME2, A.SAMPLE4、A.SAMPLE5、...、 B.GHI,B.JKL,... (A.SAMPLE11 +B.XYZ) 作为 SOMENAME3

我用过 union 但没用。

select SAMPLE1,SAMPLE2,SAMPLE3,...,SAMPLE 11 from TABLE A
UNION 
SELECT SAMPLE1, ABC, DEF, ...., XYZ FROM TABLE B

现在出现错误:

消息 205,第 16 级,状态 1,第 1 行

使用 UNION 组合的所有查询, INTERSECT 或 EXCEPT 运算符必须有 中相同数量的表达式 他们的目标列表。

我用过 union、coalesce、full outer join(下面的所有建议或答案)

最终代码将用于select 语句。怎么样?

【问题讨论】:

【参考方案1】:

您可能正在寻找join,例如:

select  a.sample1
,       a.sample2
,       b.abc
,       b.def
...  etc  ...
from    TableA as a
full outer join
        TableB as b
where   a.sample1 = b.sample1

【讨论】:

但这只会从左表中获取所有数据,这意味着我现在不想要的表 A。我想要表 A 和表 B 中的所有列,但表 A 和表 B 中的唯一列 (sample1) 应该合并为一个列。 @Shahsra:那是full outer join,答案已编辑【参考方案2】:

使用 FULL OUTER 连接两个表(保留其中一个表中不存在的数据),然后使用 COALESCE 从任何一个表中获取公共 SAMPLE1 列。

SELECT COALESCE(A.SAMPLE1, B.SAMPLE1) SAMPLE1,
     A.SAMPLE2,
     A.SAMPLE3,
     ...
     A.SAMPLE11,
     B.ABC,
     B.DEF,
     ...
     B.XYZ
FROM table1 A FULL OUTER JOIN table2 B on A.SAMPLE1 = B.SAMPLE1

参考:MSDN - Using Outer Joins / COALESCE

【讨论】:

它可以工作,但给了我数百万条记录。我猜它在这种情况下使用交叉连接。【参考方案3】:

试试这个,可能有用

表 1 包含 5 列

select col1,col2...col5 from table1

表 2 包含 3 列

select col1,col2,col3 from table1

查询:

select col1,col2,col3,col4,col5 from table1
union
select col1,col2,col3,'','' from table1

【讨论】:

以上是关于连接来自两个不同表的两列的主要内容,如果未能解决你的问题,请参考以下文章

显示来自两个不同表的两列之间的差异(比较表)

根据两个不同表上的两列对完全连接进行排序

如何将两个表与 SQL Server 中第二个表中引用同一列的两列连接起来

如何基于每个数据框中具有不同名称的两列将两个数据框与 dplyr 连接起来? [复制]

验证两个不同表的两列完全匹配

想比较laravel中不同表的两列