where语句中断MySQL中的完全连接

hrirmatl  于 2023-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(139)

考虑以下表格:

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
r55awzrz

r55awzrz1#

看起来你应该在正确的连接查询中使用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上的演示

ctehm74n

ctehm74n2#

我已经试过了,但它不起作用:
其中t1. date>“2022-01-01”或t1date =空
你应该用

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

“NULL = NULL”结果为false,因为NULL没有值。因此,它不能与任何其他值相同(即使是另一个NULL)。正确的方法是使用is null

cygmwpex

cygmwpex3#

在MySQL中,要检查一个值是否为null,你不需要使用value = null,而是使用value IS NULLvalue IS NOT NULL,如果你想检查这个值是什么时候赋值的。
结果,你会得到:

WHERE `t1`.`date` > "2022-01-01" OR `t1`.`date` IS NULL

在MySQL是正确的写在大写的指令。

相关问题