考虑以下表格:
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>“whatever”过滤了t1
表中的所有空行。我已经试过了,但它不起作用:
where `t1`.`date` > "2022-01-01" or `t1`.`date` = null
3条答案
按热度按时间r55awzrz1#
看起来你应该在正确的连接查询中使用
t2.date > "2022-01-01"
。参见https://dbfiddle.uk/reo8UanD上的演示
ctehm74n2#
我已经试过了,但它不起作用:
其中
t1
.date
>“2022-01-01”或t1
。date
=空你应该用
“NULL = NULL”结果为false,因为NULL没有值。因此,它不能与任何其他值相同(即使是另一个NULL)。正确的方法是使用
is null
cygmwpex3#
在MySQL中,要检查一个值是否为null,你不需要使用
value = null
,而是使用value IS NULL
或value IS NOT NULL
,如果你想检查这个值是什么时候赋值的。结果,你会得到:
在MySQL是正确的写在大写的指令。