SQL:合并两个没有 'Join on' 的表

标签 sql sql-server database join sql-server-2014

所以我有两个表,其中只有几个相似的列,我需要加入它们以给它们一个共同的排序,但不合并任何数据。

例如:

表富:

AccountID   Date        FooType
--------------------------------
1234        12/24/15    A
1234        12/12/15    A
5464        01/04/15    A

表格栏:

AccountID   Date        BarAmount   BarFlag
--------------------------------------------
1234        05/03/15    12.56       1
7657        02/14/15    5.11        0
9879        01/04/15    8.00        1

目标是让输出为:

AccountID   Date        BarAmount   BarFlag    FooType
-------------------------------------------------------
1234        05/03/15    12.56       1          NULL
1234        12/24/15    NULL        NULL       A
1234        12/12/15    NULL        NULL       A
7657        02/14/15    5.11        0          NULL
9879        01/04/15    8.00        1          NULL
5464        01/04/15    NULL        NULL       A

所以换句话说,我不想通过加入 AccountID 来合并(这会给我 4 或 5 行,具体取决于我的设置方式)但我确实希望列在命名时被填充相同。 (表之间有一些交叉)

UNION ALL 给我一个错误,因为这些表虽然有一些共同的列,但非常不同。它给出的错误是:“使用 UNION、INTERSECT 或 EXCEPT 运算符组合的所有查询在其目标列表中必须具有相同数量的表达式。”一些文章声称这可以通过指定列名来绕过。我试过了(下面的查询),它仍然给我错误。

SELECT [AccountID],[Date],[BarAmount],[BarFlag] FROM Bar 
UNION ALL
SELECT [AccountID],[Date],[FooType] FROM Foo

我想到的另一种方法是将它们插入到新表中,但由于这些列是从其他查询派生的,因此可能需要更改这些列。所以我不能只创建一个表来使用,我必须即时进行(使用临时表或在我完成后将其删除,诸如此类)。挑战在于我似乎无法弄清楚如何动态创建我需要的额外列。例如,如果我用这个开始:

SELECT * INTO NewTable FROM Bar 

然后我会得到来自 Bar 的所有记录,SQL 会帮助我创建列。但是,当我想从 Foo 获取记录时,我不能再执行一次 INSERT INTO,因为该表已经存在。我可以执行 INSERT INTO,但如何在不在 ALTER TABLE 语句中指定名称和数据类型的情况下添加 NewTable 中不存在的额外列? (因为我不知道它们的名称和数据类型是什么,所以这可能很困难)

因此,我们将不胜感激,我不在乎如何达到上面列出的“目标”,只要我能达到目标即可。感谢您的宝贵时间。

编辑:

成功了,谢谢!有时是最小的事情造成了不同。对于那些将来可能会引用此问题的人,需要注意一件事:顺序很重要!我基于这个答案构建了我的查询并开始出现错误。错误:“从字符串转换日期和/或时间时转换失败。”是因为我没有执行上述查询,而是做了类似的事情:

SELECT **[Date]**,[AccountID],[BarAmount],[BarFlag],NULL as FooType FROM Bar 
UNION ALL
SELECT [AccountID],**[Date]**,NULL,NULL,[FooType] FROM Foo

它试图将文本放入日期列,但无法协调它,所以它不会工作。当列是公共(public)列时,顺序很重要(而且这只是合乎逻辑的)。再次感谢 sgeddes!

最佳答案

您很接近 - union all 需要具有相同数量的列。试试这个:

SELECT [AccountID],[Date],[BarAmount],[BarFlag],NULL as FooType FROM Bar 
UNION ALL
SELECT [AccountID],[Date],NULL,NULL,[FooType] FROM Foo

关于SQL:合并两个没有 'Join on' 的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35330383/

相关文章:

asp.net - 图像保存到数据库时获取图像的高度和宽度

sql-server - SQL 连接整数并用 from to 对它们进行分组

database - spring自动生成数据库模型类

sql - 根据别名列名进行过滤

mysql - 分组依据但选择确切记录(如果存在)

sql-server - 西里尔字母搜索

MySQL:回滚时间更长?

mysql - 在 Ruby on Rails 应用程序中将数据库从 PostgreSQL 更改为 MySQL

MySQL - 几个月内的每月排名

mysql - 在重复键更新时添加值