如何并排连接两个不同的表(没有公共列)而不在 Mysql 的输出中进行交叉连接?

How to join two different tables(without common column) side by side without getting cross join in the output in Mysql?

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

为 t1 创建 table 查询:

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

t1 table 的输出是:

i   foo
1   1
2   2
3   3
4   4

创建 table 日期查询 table:

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');

日期 table 的输出是:

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 和日期 table 并排

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

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

但是,您可以使用 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 没有实现。然而,它可以用左连接和反连接来模拟。