mfl*_*g14 3 sql database sql-server join sql-server-2014
所以我有两个表只有几个相似的列,我需要加入它们以给它们一个共同的排序,但没有组合任何数据.
例如:
表Foo:
AccountID Date FooType
--------------------------------
1234 12/24/15 A
1234 12/12/15 A
5464 01/04/15 A
Run Code Online (Sandbox Code Playgroud)
表栏:
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
Run Code Online (Sandbox Code Playgroud)
目标是使输出为:
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
Run Code Online (Sandbox Code Playgroud)
所以换句话说,我不希望通过加入AccountID来结合(这会给我4行或5行,具体取决于我如何设置它)但我确实希望在列名相同时填充列.(桌子之间有一些交叉)
UNION ALL给了我一个错误,因为表格虽然有一些共同的列,却是非常不同的.它给出的错误是:"使用UNION,INTERSECT或EXCEPT运算符组合的所有查询必须在其目标列表中具有相同数量的表达式." 有些文章声称可以通过指定列名来绕过它.我试过了(下面的查询),它仍然给了我错误.
SELECT [AccountID],[Date],[BarAmount],[BarFlag] FROM Bar
UNION ALL
SELECT [AccountID],[Date],[FooType] FROM Foo
Run Code Online (Sandbox Code Playgroud)
我遇到的另一种方法是将它们插入到新表中,但由于列是从其他查询派生的列,因此列可能需要更改.所以我不能只创建一个表来使用,我必须动态地使用它(使用临时表或在完成后删除它,类似的东西).我面临的挑战是,我似乎无法弄清楚如何动态创建我需要的其他列.例如,如果我使用它来启动:
SELECT * INTO NewTable FROM Bar
Run Code Online (Sandbox Code Playgroud)
然后我将获得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
Run Code Online (Sandbox Code Playgroud)
它试图将文本放入日期列并且无法协调它,因此它不起作用.当列是常用列时,顺序很重要(并且它只是合乎逻辑的).再次感谢sgeddes!
你很接近 - union all需要有相同数量的列.试试这个:
SELECT [AccountID],[Date],[BarAmount],[BarFlag],NULL as FooType FROM Bar
UNION ALL
SELECT [AccountID],[Date],NULL,NULL,[FooType] FROM Foo
Run Code Online (Sandbox Code Playgroud)