代码之家  ›  专栏  ›  技术社区  ›  Sergey_Z

MySQL只需无条件连接2个表和交叉连接

  •  -1
  • Sergey_Z  · 技术社区  · 1 年前

    表1:

    价值
    b

    表2:

    价值
    c
    d
    e

    我需要得到这个结果:

    价值 价值
    c
    b d
    无效的 e

    所以,这就像 简单 连接,当第一个表中的行与第二个表中相应的(按顺序)行匹配时,没有任何条件。

    作为一种变通方法,我想到了这个:

    SELECT value, "table1" AS src FROM t1
    UNION ALL
    SELECT value, "table2" AS src FROM t2
    

    这给出了:

    价值 src
    表1
    b 表1
    c 表2
    d 表2
    e 表2

    总的来说,这是合适的,但可以按照我在上面的必要结果中展示的那样完成吗?

    1 回复  |  直到 1 年前
        1
  •  1
  •   samhita    1 年前

    在这种情况下,您没有提到任何将定义顺序的列 value 列用于添加排序,使用 ROW_NUMBER() .

    • CTE表1_with_rown和表2_with_rownum将分配顺序。
    • 然后根据rownum连接这些数据集,以保持顺序,并联合结果集以删除任何重复项。

    Fiddle

    WITH table1_with_rownum AS (
        SELECT value, ROW_NUMBER() OVER (ORDER BY value) AS rownum
        FROM table1
    ),
    table2_with_rownum AS (
        SELECT value, ROW_NUMBER() OVER (ORDER BY value) AS rownum
        FROM table2
    )
    
    SELECT 
        t1.value AS value1, 
        t2.value AS value2
    FROM table1_with_rownum t1
    LEFT JOIN table2_with_rownum t2 ON t1.rownum = t2.rownum 
    
    UNION
    
    SELECT 
        t1.value AS value1, 
        t2.value AS value2
    FROM table1_with_rownum t1
    RIGHT JOIN table2_with_rownum t2 ON t1.rownum = t2.rownum
    ORDER BY value1;
    

    输出

    enter image description here