首页 > 解决方案 > 如何并排连接两个不同的表(没有公共列)而不在 Mysql 的输出中获得交叉连接?

问题描述

我想并排连接两个不同的表,而不会丢失表中的任何行,结果不应该是交叉连接。

为 t1 创建表查询:

CREATE TABLE IF NOT EXISTS t1 (
    `i` INT,
    `foo` INT);
INSERT INTO t1 VALUES
    (1,1),
    (2,2),
    (3,3),
    (4,4);

t1 表的输出为:

i   foo
1   1
2   2
3   3
4   4

为日期表创建表查询:

CREATE TABLE IF NOT EXISTS dates (
    `User` VARCHAR(2) CHARACTER SET utf8,
    `start_date` date,
    `end_date` date
);
INSERT INTO dates VALUES
    ('U1','2020-01-01','2020-01-31'),
    ('U2','2020-01-16','2020-01-26'),
    ('U3','2020-01-28','2020-02-06');

日期表的输出是:

User  start_date    end_date
U1    2020-01-01    2020-01-31
U2    2020-01-16    2020-01-26
U3    2020-01-28    2020-02-06

但我想要这样的输出:t1 和日期表并排

i  foo  User   start_date   end_date
1   1    U1    2020-01-01   2020-01-31
2   2    U2    2020-01-16   2020-01-26
3   3    U3    2020-01-28   2020-02-06
4   4    null   null        null

标签: mysqlsqlmysql-workbench

解决方案


关系代数不是这样工作的,所以普通的连接和联合不会产生你想要的结果。

但是,您可以使用ROW_NUMBER(). 例如:

with a as (
  select *, row_number() over() as rn from t1
),
b as (
  select *, row_number() over() as rn from dates
)
select a.i, a.foo, b.User, b.start_date, b.end_date
from a left join b on a.rn = b.rn

注意:上面的解决方案假设a行数多于b. 如果这不是给定的,则查询将需要完全连接,不幸的是 MySQL 没有实现。然而,它可以用左连接和反连接来模拟。


推荐阅读