【问题标题】:Merge two distinct table having completely different columns合并两个具有完全不同列的不同表
【发布时间】:2020-02-25 13:13:08
【问题描述】:

我正在寻找一种在我的脚本中合并两个变量(表)的方法。变量一具有三列和 54 行。变量 2 有 4 列和 1 行。这 1 行将从第一个变量传播到所有 54 行。我想将这些列并排组合成一个表变量。

我对 SQL Server 和 stackoverflow 社区非常陌生。您的帮助将不胜感激。谢谢! 编辑: - 感谢您回答我的问题。让我尽量把样本表放在这里。为简化起见,请假设列名是 A、B、..G

表 1 |一个 |乙| C | +-----+----+------+ | 86 | 0 | 4711 | | 86 | 0 | 4712 | | 86 | 0 | 4713 | | 86 | 0 | 4714 | +-----+---+-----+

表2 +-----+------+------+---------+ | D | E | F |克| +-----+------+------+---------+ |真 |空 |空 | 00:00.0 | +------+------+------+---------+

预期结果 一个 |乙| C | D | E | F |克| +----+----+------+------+------+------+---------+ | 86 | 0 | 4711 |真的 |空 |空 | 00:00.0 | | 86 | 0 | 4712 |真的 |空 |空 | 00:00.0 | | 86 | 0 | 4713 |真的 |空 |空 | 00:00.0 | | 86 | 0 | 4714 |真的 |空 |空 | 00:00.0 | +----+----+------+------+------+------+---------+

【问题讨论】:

  • 向我们展示每个表的一些示例表数据,以及组合结果。 (作为格式化文本,没有图像。)

标签: sql sql-server


【解决方案1】:

听起来像是交叉连接:

select *
from table1 t1 cross join
     table2;

【讨论】:

    【解决方案2】:

    正如我所见,到目前为止提供的所有这些灵魂都会给你一个正确的答案。 还有这种旧方法:

    select * 
    from table1, table2
    

    这是一个小演示,您可以在其中看到此解决方案的实际示例: https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=daac030e2971db13e57e90da7378db20

    【讨论】:

    • 虽然这是真的,但我怀疑 OP 使用的 DBMS 是否需要使用这种过时的连接语法。
    【解决方案3】:

    所以根据你想要实现的目标,让 mi 可视化。

    假设您有 2 张桌子:

    CREATE TABLE Bar
    (
      BarId INT NOT NULL
    );
    
    CREATE TABLE Foo
    (
       FooId INT NOT NULL
    );
    
    INSERT INTO Bar(BarId) VALUES
    (1),
    (2);
    
    INSERT INTO Foo(FooId) VALUES
    (10),
    (20),
    (30);
    
    1. 交叉连接是笛卡尔积,因此数据将是两个集合的乘积,以形成所有有序对的集合
    SELECT * 
    FROM table1 
    CROSS JOIN table2;
    

    输出

    | FooId | BarId |
    |-------|-------|
    |    10 |     1 |
    |    20 |     1 |
    |    30 |     1 |
    |    10 |     2 |
    |    20 |     2 |
    |    30 |     2 |
    
    1. 完全外连接将显示左右表中的所有值
    SELECT *
    FROM table1
    FULL OUTER JOIN table2
    ON table1.column_name = table2.column_name ON (1 = 0) --nothing we can match those tables on
    

    输出

    |  FooId |  BarId |
    |--------|--------|
    |     10 | (null) |
    |     20 | (null) |
    |     30 | (null) |
    | (null) |      1 |
    | (null) |      2 |
    

    小提琴http://sqlfiddle.com/#!18/74d24/1

    【讨论】:

      【解决方案4】:

      试试下面的简单方法:

      select * from tableA left join tableB as tableC on 1 = 1;
      

      上面的查询带来了两个表中的所有列。

      【讨论】:

      • 左连接是一种外连接,即使第二个表中没有匹配项,它也会保留第一个表中的行。 1 = 1 然而总是正确的,所以这里没有发生外连接。这只是一个内部连接。由于1 = 1 没有引用有问题的行,所以这根本不是条件。因此,实际上甚至不是内部联接,而是 交叉联接。因此,我不赞成这个答案。我建议您查看连接以了解差异。毕竟,这些差异是他们在 1992 年发明的一个原因。
      猜你喜欢
      • 2018-03-18
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      相关资源
      最近更新 更多