请考虑下表:

create table `t1` (
  `date` date,
  `value` int
);

create table `t2` (
  `date` date,
  `value` int
);

insert into `t1` (`date`, `value`)
values ("2022-01-01", 1),
       ("2022-03-01", 3),
       ("2022-04-01", 4);
       
insert into `t2` (`date`, `value`)
values ("2022-01-01", 1),
       ("2022-02-01", 2),
       ("2022-04-01", 4);

t1表缺少2022-02-01日期,t2缺少2022-03-01日期.我希望将这两个表连接在一起,以便产生以下结果:

| t1.date    | t1.value | t2.date    | t2.value |
|            |          |            |          |
| 2022-01-01 | 1        | 2022-01-01 | 1        |
| null       | null     | 2022-02-01 | 2        |
| 2022-03-01 | 3        | null       | null     |
| 2022-04-01 | 4        | 2022-04-01 | 4        |

解决方案是完全联接:

select *
from `t1`
left join `t2` on `t2`.`date` = `t1`.`date`

union

select *
from `t1`
right join `t2` on `t2`.`date` = `t1`.`date`;

这就产生了我想要的结果.但一句where的话就会打破一切:

select *
from `t1`
left join `t2` on `t2`.`date` = `t1`.`date`
where `t1`.`date` > "2022-01-01"

union

select *
from `t1`
right join `t2` on `t2`.`date` = `t1`.`date`
where `t1`.`date` > "2022-01-01";

我预料到的结果是:

| t1.date    | t1.value | t2.date    | t2.value |
|            |          |            |          |
| null       | null     | 2022-02-01 | 2        |
| 2022-03-01 | 3        | null       | null     |
| 2022-04-01 | 4        | 2022-04-01 | 4        |

但我得到的是:

| t1.date    | t1.value | t2.date    | t2.value |
|            |          |            |          |
| 2022-03-01 | 3        | null       | null     |
| 2022-04-01 | 4        | 2022-04-01 | 4        |

我想我知道发生了什么事,但我找不到解决办法.问题是t1.date>"Whatwhere"过滤了t1个表中的所有空行.我已经试过了,但不起作用:

where `t1`.`date` > "2022-01-01" or `t1`.`date` = null

推荐答案

看起来您应该在正确的联接查询中使用t2.date > "2022-01-01".

select *
from `t1`
left join `t2` on `t2`.`date` = `t1`.`date`
where `t1`.`date` > "2022-01-01"

union

select *
from `t1`
right join `t2` on `t2`.`date` = `t1`.`date`
where  `t2`.`date` > "2022-01-01";

https://dbfiddle.uk/reo8UanD岁时观看演示

Mysql相关问答推荐

完全相同的A B表达在SQL中的不同上下文中意外返回不同的结果

一次又一次地删除事件行

SQL:CAST与窗口函数组合导致语法错误

如何跨多个产品查找相同时间范围的数据集

MySQL:统计单词在单元格中出现的次数,并将数字放在bra中单词的旁边

MySQL grant语句中的用户名区分大小写

从表中 Select 具有不同顺序的列

布尔值之间的 SQL less/greater 比较会产生意外结果

实体内约束的唯一增量 ID 生成

拆分列值并适当地返回拆分值

有人可以帮我用 R 编程解决这个问题吗?

SQL从具有相同列的行中 Select 最后一行

保存SQL查询的中间结果

如何在任何连续范围内获得最大值

避免重复进入mysql数据库的最佳方法

你如何 OR 两个 LIKE 语句?

如何将时刻 JS 时间插入 MySQL

MySQL 中的 VARCHAR(255) 和 TINYTEXT 字符串类型有什么区别?

MySQL:唯一字段需要是索引吗?

int(11) 和 int(11) UNSIGNED 有什么区别?