【问题标题】:How to join two tables that are exactly the same column names with third table with unique column names to create new view?如何将列名完全相同的两个表与具有唯一列名的第三个表连接起来以创建新视图?
【发布时间】:2018-12-17 13:04:10
【问题描述】:

我想创建一个基于连接三个表的新视图。

表 1 和表 2 具有相同的列名,但其中的数据代表不同的时间范围。第三个表的列在两个表中都是唯一的。

我的查询获取 table1 的所有数据并使用表 1 中的列从表 2 中提取所有匹配的记录。

然后将此组合数据集与日期大于“2017-12-01”的第三个表合并

SELECT *
FROM table1
    LEFT JOIN table2
        ON table1.lookup_column = table2.lookup_column
    LEFT JOIN table3
        ON table3.lookup_column = table1.lookup_column
        AND table3.date >= '2017-10-01' 

当我运行这个查询来创建新视图时

select * into new_table 
FROM table1
        LEFT JOIN table2
            ON table1.lookup_column = table2.lookup_column
        LEFT JOIN table3
            ON table3.lookup_column = table1.lookup_column
            AND table3.date >= '2017-10-01'

我得到了错误:

Column names in each table must be unique. Column name 'abc' in table 'new_table' is specified more than once.

如何避免列名完全相同的两个表之间出现此问题?或者如何指定我想在列名上组合表 1 和表 2?

编辑:

input

table 1                table2                 table
col1    col2           col1    col2           col3    col4
abc     def            ghi     jkl            mno      pqr


Output:

col1   col2   col3   col4
abc    def    mno    pqr
ghi    jkl    mno    pqr

【问题讨论】:

  • 错误的哪一部分你不明白?这似乎是一个明确的错误消息。列出您在视图中明确需要的列。
  • @GordonLinoff 如果我从表 1 中选择所有列,并且查询正在查找表 2 中的相同列,那么新视图是否仍会包含表 2 中的数据?还是我必须选择表 2 中的所有列才能显示表 2 中的数据?
  • 您只需要列出您想查看的字段,并为其设置别名即可。即:选择table1.field1作为t1f1,table2.fieldN作为t2fN,...
  • 三思而后行,你会如何处理这样的观点。您正在选择一个新表格,而不是创建一个视图(您将如何处理这样的表格?)。
  • @CetinBasoz 你还有什么其他建议?我被要求使用该查询创建一个新视图或表。我是新手,所以对所有建议持开放态度。

标签: sql sql-server sql-server-2012


【解决方案1】:

您必须为要复制到new_table 中的table1table2 中的每一列设置不同的名称。 例如:

select table1.field1 as T1, table2.field1 as T2,
       table1.field2 as T3, table2.field2 as T4
into new_table 
FROM table1
    LEFT JOIN table2
        ON table1.lookup_column = table2.lookup_column
    LEFT JOIN table3
        ON table3.lookup_column = table1.lookup_column
        AND table3.date >= '2017-10-01'

【讨论】:

    【解决方案2】:

    查看预期的输出,以及 table1 和 table2 在结构上相同的事实,您可能想要UNION

    SELECT table1.foo, table1.bar, table3.*
    FROM      table1
    LEFT JOIN table2 ON table1.lookup_column = table2.lookup_column
    LEFT JOIN table3 ON table1.lookup_column = table3.lookup_column AND table3.date >= '2017-10-01'
    
    UNION ALL
    
    SELECT table2.foo, NULL,       table3.*
    FROM      table1
    LEFT JOIN table2 ON table1.lookup_column = table2.lookup_column
    LEFT JOIN table3 ON table1.lookup_column = table3.lookup_column AND table3.date >= '2017-10-01'
    

    【讨论】:

    • 刚试过这个,忘了说表 3 最多有 8 列。我收到错误All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists. 如何避免联合中的列号不匹配?
    • 您必须在 union 的 both 部分中匹配 table3.*
    • 我发现问题 table1 有 1 个额外的列不在表 2 中。无论如何我可以在查询中包含此列吗?
    • 列数必须匹配,类型必须兼容。话虽如此,请根据需要插入尽可能多的, NULL, ,以便较短的列数与较大的列数匹配。有关示例,请参见修订后的答案。
    【解决方案3】:

    通过 select * into [something] 您正在创建一个新表。

    你可以这样做来创建一个视图:

    创建视图 [dbo].[ViewName]

    作为

    选择 *

    来自表 1

    LEFT JOIN table2
    
        ON table1.lookup_column = table2.lookup_column
    
    LEFT JOIN table3
    
        ON table3.lookup_column = table1.lookup_column
    
        AND table3.date >= '2017-10-01';
    

    然后您可以通过以下方式使用视图:

    从 [ViewName] 中选择 *;

    【讨论】:

    • 谢谢,但是遇到和上面一样的问题,需要做一个垂直连接
    【解决方案4】:

    看到您想要的示例数据和输出,这与连接 3 个表和左连接没有任何关系。

    select * 
    from table1
    cross join table3
    union all
    select * 
    from table2
    cross join table3;
    

    你可以看到demo here.

    但是,您的示例数据不足以指出预期的问题。如果您在不知道自己在做什么的情况下使用交叉连接,那么交叉连接是一种危险的连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      相关资源
      最近更新 更多