Pernyataan "di mana" dalam MySQL akan mengganggu sambungan penuh
P粉141925181
P粉141925181 2023-09-07 21:23:58
0
2
595

Pertimbangkan borang berikut:

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. Saya ingin menyertai dua jadual ini untuk menghasilkan keputusan berikut:

| 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        |

Penyelesaian adalah dengan menggunakan sambungan penuh:

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

union

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

Ini akan memberikan saya hasil yang saya inginkan. Tetapi menggunakan pernyataan where memecahkan segala-galanya:

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";

Saya menjangkakan keputusan ini:

| 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        |

Tetapi saya mendapat keputusan ini:

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

Saya tahu apa yang salah tetapi tidak dapat mencari penyelesaian. Masalahnya ialah dengan semua baris kosong dalam jadual t1.date > "whatever"过滤了t1. Saya telah mencuba kaedah ini tetapi tidak berkesan:

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

membalas semua(2)
P粉201448898

Anda harus menggunakan

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

"NULL = NULL" menilai kepada palsu kerana NULL tidak mempunyai nilai. Oleh itu ia tidak boleh sama dengan mana-mana nilai lain (walaupun NULL lain). Cara yang betul ialah menggunakan is null

P粉729198207

Nampaknya anda harus menggunakan t2.date > "2022-01-01" dalam pertanyaan sertai yang betul.

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";

Lihat demo di https://dbfiddle.uk/reo8UanD.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan