【问题标题】:SQL: Combine two tables without a 'Join on'SQL:组合两个没有“加入”的表
【发布时间】:2016-05-21 16:49:21
【问题描述】:

所以我有两个表,其中只有几个相似的列需要连接,以便为它们提供通用排序,但没有组合任何数据。

例如:

餐桌:

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

它试图将文本放入日期列,但无法对其进行协调,因此无法正常工作。当列是一个共同的列时,顺序很重要(而且它只是合乎逻辑的)。再次感谢 sgeddes!

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 成功了,谢谢!适合我的评论:请参阅编辑后的帖子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 2021-03-06
    • 2015-08-13
    相关资源
    最近更新 更多