连接来自两个不同表的两列
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 中第二个表中引用同一列的两列连接起来