【问题标题】:MYSQL: Two Table SELECT without common valuesMYSQL:没有共同值的两个表 SELECT
【发布时间】:2010-12-08 01:26:27
【问题描述】:

我需要一个查询来对 table1 和 table2 进行选择。我希望它们显示为一个共同的结果,但没有任何连接,表 1 中没有任何值与表 2 中的任何值相对应。因此,如果结果来自 table1,它应该包含值 table1.a , table1.b, table1.c 如果它来自 table2,它应该有 table2.d、table2.e、table2.f,其中 a、b、c 值为空。

SELECT * FROM table1, table2 

...对我没有帮助,因为它总是建立连接,将 table1 和 table2 的结果连接到一个结果中。我需要将它们分开,每个结果都有自己的行。

简单、困难还是不可能?

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    试试这个:

    SELECT * FROM table1 UNION SELECT * FROM table2
    

    【讨论】:

    • 除非我弄错了,否则只有当 table1 中的列数等于 table2 中的列数时才有效。但是自从我在 MySQL 中完成 UNION 已经有一段时间了,也许这已经改变了。
    • 是的,我认为列的数量和类型必须相同,名称/别名也可能相同。但 UNION 查询是可行的方法。
    【解决方案2】:

    我正在尝试做类似的事情,但对我找到的任何答案都不满意,所以我想出了以下实现。

    /* Create Sample Data
    */
    declare @a table(a varchar(max))
    declare @b table(b varchar(max))
    insert @a (a)
    values('a1'),('a2'),('a3'),('a4');
    
    insert @b (b)
    values('b1'),('b2'),('b3');
    
    /* Show Cartesian Intersection of both tables
    */
    select * from @a, @b
    
    /* Create matching table variables with ID column
    */
    declare @aIdx table(a varchar(max), Id int identity(1,1))
    declare @bIdx table(b varchar(max), Id int identity(1,1))
    
    insert into @aIdx (a)
    select a
    from @a
    
    insert into @bIdx (b)
    select b
    from @b
    
    /* Join Record by Record
    */
    select
        l.Id,
        l.a,
        r.b 
    from @aIdx l full outer join @bIdx r on l.Id = r.Id
    

    两张表的笛卡尔坐标为:

    a1  b1
    a2  b1
    a3  b1
    a4  b1
    a1  b2
    a2  b2
    a3  b2
    a4  b2
    a1  b3
    a2  b3
    a3  b3
    a4  b3
    

    按记录加入记录:

    1   a1  b1
    2   a2  b2
    3   a3  b3
    4   a4  NULL
    

    【讨论】:

      【解决方案3】:

      您需要为两个表中的等效列使用相同的别名,例如:

      ( select a as FIRST_COL
        from table 1 
      ) 
      union 
      ( select d as FIRST_COL
        from table2 
      )
      

      【讨论】:

        【解决方案4】:

        如果我理解你的愿望 从 table1 中选择 a,b,c,'','','' union '','','',e,f,g from table2

        用您最喜欢的空列占位符替换 '' a,b,c - 列名。

        【讨论】:

          【解决方案5】:

          只要列类型相同,就可以使用联合。例如:

          select a, b, c
          from table1
          union
          select d, e, f
          from table2
          

          如果它们不相同,您仍然可以通过创建“虚拟”列来实现。只要列的类型和数量相同,结果就会显示为一组行。

          【讨论】:

            猜你喜欢
            • 2016-03-16
            • 1970-01-01
            • 1970-01-01
            • 2013-11-04
            • 1970-01-01
            • 2015-06-30
            • 2011-12-31
            • 2015-06-28
            • 2017-10-22
            相关资源
            最近更新 更多