mysql - 如何并排连接两个不同的表(没有公共列)而不在 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
解决方案
关系代数不是这样工作的,所以普通的连接和联合不会产生你想要的结果。
但是,您可以使用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 没有实现。然而,它可以用左连接和反连接来模拟。
推荐阅读
- react-native - 反应原生 - 无法解析配置':classpath'的所有依赖项
- java - 在 Spring Boot 应用程序中调用 ExecutorService
- apache-camel - 什么是 rest DSL 的推荐 rest 组件
- csv - 运行 csv 中定义的用户;对于在线程组中定义的循环数 -Jmeter
- php - input type="file" 返回 fakepath 而不是真实源
- reactjs - 从外部文件调用 React js 函数
- android - Java 8“可选”不好的做法?
- angular - Angular Nativescript 使用的版本?
- python-3.x - 安装“Statsmodels”时出错
- python - 使用 cpu 作为配置设备时使用 python3.6 在 linux 中的 theano 导入错误