连接具有不同列数的两个表

Posted

技术标签:

【中文标题】连接具有不同列数的两个表【英文标题】:Join two tables with different column counts 【发布时间】:2014-05-15 13:23:54 【问题描述】:

我正在尝试从两个不同的表中创建一个表

Table 1 has 

ID   Place      Value   Date  
--------------------------------
1    Place     Value1   Date1
2    Place1    Value2   Date2
4    Place2    Value1   Date1
7    Place3    Value2   Date1

and Table2 has 

ID    Name        Values
------------------------
3    ColName1    Value2
5    ColName2    Value1
6    ColName3    Value2

现在我想创建一个带有 ID、Table1.Place、Table1.Date 和 Table2.Value 的新表

我尝试过使用

INSERT INTO [dbo].[tblNewTable] 
SELECT tbl1.ID, tbl1.Place, tbl1.Date
FROM [Tabble1] tbl1 
UNION
SELECT tbl2.Value 
FROM [Table2] tbl2

但它表示使用 UNION、INTERSECT 或 EXCEPT 运算符组合的所有查询必须在其目标列表中具有相同数量的表达式。

请注意,两个表中的 ID 都是唯一的。

【问题讨论】:

这两个表有什么共同点?他们有吗? 你想要的结果是什么? 为缺失的列添加了 NULL @AllanS.Hansen 所说的 - 如果您在第二个选择列表中添加两个空值,即 SELECT tbl2.value, null, null FROM [Table2] tbl2,那么联合将工作。如果您想要一个特定的值,请将其放入。也就是说,结果可能是胡言乱语。你想做什么? 【参考方案1】:

不完全确定您要的是什么。如果要使用UNION 语句,则每个查询中的列数必须相同(具有相同的数据类型)。所以在你的情况下,如果你想要的结果是得到一个 id 1 到 7 的列表,那么你需要这样的东西:

INSERT INTO [dbo].[tblNewTable] 
SELECT tbl1.ID, tbl1.Place, tbl1.Date, tbl1.Value
FROM [Tabble1] tbl1 
UNION
SELECT tbl2.ID, NULL, NULL, tbl2.Value 
FROM [Table2] tbl2

这将导致:

ID   Place     Value    Date  
--------------------------------
1    Place     Value1   Date1
2    Place1    Value2   Date2
3    NULL      Value2   NULL
4    Place2    Value1   Date1
5    NULL      Value1   NULL
6    NULL      Value2   NULL
7    Place3    Value2   Date1

或者,您正在寻找JOIN 您的表以获得通用结果集:

INSERT INTO [dbo].[tblNewTable] 
SELECT tbl1.ID, tbl1.Place, tbl1.Date, tbl2.Value
FROM [Tabble1] tbl1  
    JOIN [Table2] tbl2 ON tbl1.ID = tbl2.ID

在您提供的数据中,这将导致没有记录。

【讨论】:

【参考方案2】:

联合应该在两个具有相同数量和类型的列的表上。 查询应如下所示。您需要的是如下联接:

INSERT INTO [dbo].[tblNewTable] 
SELECT tbl1.ID, tbl1.Place, tbl1.Date, tbl2.Value 
FROM [Tabble1] tbl1,  [Table2] tbl2
WHERE tbl1.value = tbl2.value

【讨论】:

您应该使用JOIN 关键字明确指出您的加入,而不要使用ANSI-89 语法。 @BryceAtNetwork23 我无法从书面 SQL 查询中推断出这一点。此查询属于哪个环境? “是的”你可以,“是的”你是。你有Tabble1在你的FROM中排在第一位,清楚地表明你扣除了Tabble1属于“LEFT”。我要说的是,我们真的不应该使用 25 年前已弃用的语法来指定我们的 JOIN。

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

合并具有不同列数的表

构建具有不同列数的html表

具有不同列数的数据表

如何使用sql从具有不同列的两个表中获取不同的记录

自动 CSV 文件生成,在 Oracle 10g 中具有不同列数的两个标题级别的标题

在 Excel 查询编辑器中合并具有不同列数的 CSV 文件文件夹