如何并排连接两个不同的表(没有公共列)而不在 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 没有实现。然而,它可以用左连接和反连接来模拟。
我想并排连接两个不同的 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 没有实现。然而,它可以用左连接和反连接来模拟。