SQL:合并两个没有 'Join on' 的表
SQL: Combine two tables without a 'Join on'
所以我有两个 tables,只有几个相似的列,我需要加入它们以给它们一个共同的排序,但不合并任何数据。
例如:
Table 富:
AccountID Date FooType
--------------------------------
1234 12/24/15 A
1234 12/12/15 A
5464 01/04/15 A
Table 酒吧:
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 行,具体取决于我的设置方式)但我确实希望在列时填充它们名称相同。 (tables 之间有一些交叉)
A UNION ALL 给我一个错误,因为 tables 虽然有一些共同的列,但非常不同。它给出的错误是:"All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists." 一些文章声称可以通过指定列名来绕过这个错误。我试过了(下面的查询),它仍然给我错误。
SELECT [AccountID],[Date],[BarAmount],[BarFlag] FROM Bar
UNION ALL
SELECT [AccountID],[Date],[FooType] FROM Foo
我想到的另一种方法是将它们插入到新的 table 中,但由于这些列是从其他查询派生的,因此可能需要更改这些列。所以我不能只创建一个 table 来使用,我必须即时进行(使用临时 table 或在我完成后将其删除,诸如此类)。挑战在于我似乎无法弄清楚如何动态创建我需要的额外列。例如,如果我用这个开始:
SELECT * INTO NewTable FROM Bar
然后我会得到来自 Bar 的所有记录,并且 SQL 帮我创建了列。但是,当我想从 Foo 获取记录时,我不能再执行一次 INSERT INTO,因为 table 已经存在了。我可以执行 INSERT INTO,但如何添加 NewTable 中不存在的额外列,而不在 ALTER TABLE 语句中指定它们的名称和数据类型? (因为我不知道它们的名称和数据类型是什么,所以这可能很困难)
因此,我们将不胜感激,我不在乎如何到达上面列出的 'goal',只要我到达那里即可。谢谢你的时间。
编辑:
完成了,谢谢!有时是最小的事情造成了不同。对于那些将来可能会引用此问题的人,需要注意一件事:顺序很重要!我基于这个答案构建了我的查询并开始出现错误。错误:"Conversion failed when converting date and/or time from character string." 是因为我没有执行上述查询,而是做了类似这样的事情:
SELECT **[Date]**,[AccountID],[BarAmount],[BarFlag],NULL as FooType FROM Bar
UNION ALL
SELECT [AccountID],**[Date]**,NULL,NULL,[FooType] FROM Foo
它试图将文本放入日期列,但无法协调它,因此无法正常工作。当列是公共列时,顺序很重要(而且这只是合乎逻辑的)。再次感谢 sgeddes!
您很接近 -- union all
需要具有相同的列数。试试这个:
SELECT [AccountID],[Date],[BarAmount],[BarFlag],NULL as FooType FROM Bar
UNION ALL
SELECT [AccountID],[Date],NULL,NULL,[FooType] FROM Foo
所以我有两个 tables,只有几个相似的列,我需要加入它们以给它们一个共同的排序,但不合并任何数据。
例如:
Table 富:
AccountID Date FooType
--------------------------------
1234 12/24/15 A
1234 12/12/15 A
5464 01/04/15 A
Table 酒吧:
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 行,具体取决于我的设置方式)但我确实希望在列时填充它们名称相同。 (tables 之间有一些交叉)
A UNION ALL 给我一个错误,因为 tables 虽然有一些共同的列,但非常不同。它给出的错误是:"All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists." 一些文章声称可以通过指定列名来绕过这个错误。我试过了(下面的查询),它仍然给我错误。
SELECT [AccountID],[Date],[BarAmount],[BarFlag] FROM Bar
UNION ALL
SELECT [AccountID],[Date],[FooType] FROM Foo
我想到的另一种方法是将它们插入到新的 table 中,但由于这些列是从其他查询派生的,因此可能需要更改这些列。所以我不能只创建一个 table 来使用,我必须即时进行(使用临时 table 或在我完成后将其删除,诸如此类)。挑战在于我似乎无法弄清楚如何动态创建我需要的额外列。例如,如果我用这个开始:
SELECT * INTO NewTable FROM Bar
然后我会得到来自 Bar 的所有记录,并且 SQL 帮我创建了列。但是,当我想从 Foo 获取记录时,我不能再执行一次 INSERT INTO,因为 table 已经存在了。我可以执行 INSERT INTO,但如何添加 NewTable 中不存在的额外列,而不在 ALTER TABLE 语句中指定它们的名称和数据类型? (因为我不知道它们的名称和数据类型是什么,所以这可能很困难)
因此,我们将不胜感激,我不在乎如何到达上面列出的 'goal',只要我到达那里即可。谢谢你的时间。
编辑:
完成了,谢谢!有时是最小的事情造成了不同。对于那些将来可能会引用此问题的人,需要注意一件事:顺序很重要!我基于这个答案构建了我的查询并开始出现错误。错误:"Conversion failed when converting date and/or time from character string." 是因为我没有执行上述查询,而是做了类似这样的事情:
SELECT **[Date]**,[AccountID],[BarAmount],[BarFlag],NULL as FooType FROM Bar
UNION ALL
SELECT [AccountID],**[Date]**,NULL,NULL,[FooType] FROM Foo
它试图将文本放入日期列,但无法协调它,因此无法正常工作。当列是公共列时,顺序很重要(而且这只是合乎逻辑的)。再次感谢 sgeddes!
您很接近 -- union all
需要具有相同的列数。试试这个:
SELECT [AccountID],[Date],[BarAmount],[BarFlag],NULL as FooType FROM Bar
UNION ALL
SELECT [AccountID],[Date],NULL,NULL,[FooType] FROM Foo