【问题标题】:SQL - Joining two Select results horizontalSQL - 水平连接两个选择结果
【发布时间】:2016-02-09 17:49:59
【问题描述】:

我正在使用两个 SELECT 语句创建以下两个临时表 t1 和 t2:

+------+------+
| Col1 | Col2 |
+------+------+
| A    |    1 |
| B    |    2 |
| C    |    3 |
+------+------+

+------+------+
| Col3 | Col4 |
+------+------+
| C    |    5 |
| D    |    6 |
| E    |    7 |
+------+------+

两个 SELECT 语句本质上总是返回相同数量的行。现在我想将这两个结果水平连接/组合得到以下输出表:

+------+------+------+------+
| Col1 | Col2 | Col3 | Col4 |
+------+------+------+------+
| A    |    1 | C    |    5 |
| B    |    2 | D    |    6 |
| C    |    3 | E    |    7 |
+------+------+------+------+

我尝试使用多个 JOIN 语句,但可以找到一个聪明的方法。我还尝试了 UNION 语句,它提供了垂直连接,但不是所需的水平连接。

这里有两个简单的 SELECT 语句,以便在可能的解决方案中更好地定位:

SELECT * FROM `t1` WHERE date = DATE(NOW())

SELECT * FROM `t2` WHERE date = DATE(NOW())

提前感谢您的帮助。

【问题讨论】:

  • 您需要一个关系来“水平”连接这两个表。 Col2Col4是什么关系(如果有的话)?
  • 这正是我的棘手点。也许要添加更多细节:两个 SELECT 语句正在对数据进行排序,我想按此顺序组合这两个表。有什么办法不用创建新的标识符?
  • Col4 = Col2 + 4 有意义吗?

标签: mysql join


【解决方案1】:

试试这个

SET @row_number_t1:=0;
SET @row_number_t2:=0;

SELECT t1_modif.*, t2_modif.* FROM 
    (SELECT @row_number_t1:=@row_number_t1+1 AS row_number,
            t1.* FROM t1) 
    t1_modif
JOIN (SELECT @row_number_t2:=@row_number_t2+1 AS row_number,
            t2.* FROM t2) 
    t2_modif ON t2_modif.row_number = t1_modif.row_number

注意不保证顺序,为此在每个FROM t1FROM t2子查询的末尾添加ORDER BY子句,基本上我们是通过row_number加入的,因为MySQL没有ROW_ID,ROW_NUM(类似到 mssql、oracle、postgres)我们使用了会话变量

【讨论】:

    【解决方案2】:

    为关系创建虚拟 ID。虽然这不是推荐的方式。

    SELECT col1, col2, col3, col4 FROM 
        (SELECT t1.*, (@t1VID := @t1VID + 1) t1VID  FROM t1 , (SELECT @t1VID := 0) d) e 
            JOIN (SELECT t2.*, (@t2VID := @t2VID + 1) t2VID FROM t2, (SELECT @t2VID := 0) a ) b ON t1VID  = t2VID
            JOIN (SELECT @t1VID := 0) c ;
    

    理想的解决方案是在表之间添加适当的关系。如果没有,最好单独查询,在应用层做必要的join

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多