【问题标题】:Union between nonmatching columns tables不匹配列表之间的联合
【发布时间】:2021-04-26 12:14:24
【问题描述】:

假设我们有如下 3 个表:

Table1:Column1、Column2、Column3

Table2:Column1、Column2、Columnxyz、Column3

Table3:Column1、Column2、Column3

我对以下 DDL 有看法:

CREATE VIEW [dbo].[View1]
  AS (
    SELECT 'Table1' as [Source], * FROM [Table1] 
    UNION
    SELECT 'Table2' as [Source], * FROM [Table2]
    UNION
    SELECT 'Table3' as [Source], * FROM [Table3]
  );

假设所有表都具有相同的列,该视图可以完美运行。

但是,在上面的示例中,table2 具有附加列:columnxyz 我需要在视图联合中进行哪些更改? 换句话说,我是否也必须使用这个附加列创建 Table1 和 Table3,或者我们可以通过以某种方式动态地将视图中的这个额外列附加到缺少它的其他表并用“None”或“N”填充它来规避这个问题/A" 作为默认数据(因为 Table1 和 table2 最初没有这个 columnxyz 所以真的没有数据)?

【问题讨论】:

  • @DaleK 所说的,或者不选择该列,只选择常用列。你可能想要union all 而不是union
  • @DaleK 我看到这样:SELECT 'Table1' as [Source], [columnxyz] * FROM [Table1] bt 你是什么意思我应该单独列出所有列?是因为订单吗?
  • @Charlieface 事情是我们需要 columnxyz,因为它将被馈送到 SSAS 多维数据集(View1 将充当数据源)
  • @DaleK 是的,我想我知道你的意思,但是对于那个问题,我只记得重新创建视图
  • @DaleK 也许我实际上必须在这里做,因为 columnxy 无论如何都要按特定顺序(例如第 3 列)

标签: sql sql-server tsql


【解决方案1】:

从没有附加列的表中选择一个常量,与您已经为[Source] 所做的完全相同。但是,您必须明确列出列,因为附加列不是第一列或最后一列。作为最佳实践,您始终应该列出您的列。

CREATE VIEW [dbo].[View1]
AS (
  SELECT 'Table1' as [Source], Column1, Column2, 'N/A' AS ColumnXYZ, Column3
  FROM [Table1] 
  UNION ALL
  SELECT 'Table2' as [Source], Column1, Column2, ColumnXYZ, Column3
  FROM [Table2]
  UNION ALL
  SELECT 'Table3' as [Source], Column1, Column2, 'N/A' AS ColumnXYZ, Column3
  FROM [Table3]
);

注意,我使用了UNION ALL,因为UNION 会尝试复制您的数据,这通常是您不想要的,并且这样做会导致性能损失。就我个人而言,我总是以其他方式处理重复数据删除/分组。

【讨论】:

    猜你喜欢
    • 2011-08-17
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多