Maison > Questions et réponses > le corps du texte
Considérez le formulaire suivant :
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
. Je souhaite joindre ces deux tableaux pour produire le résultat suivant :
| 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 |
La solution est d'utiliser une connexion complète :
select * from `t1` left join `t2` on `t2`.`date` = `t1`.`date` union select * from `t1` right join `t2` on `t2`.`date` = `t1`.`date`;
Cela me donnera les résultats que je souhaite. Mais utiliser l'instruction where
casse tout :
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";
Je m'attendais à ce résultat :
| 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 |
Mais j'ai obtenu ce résultat :
| t1.date | t1.value | t2.date | t2.value | | | | | | | 2022-03-01 | 3 | null | null | | 2022-04-01 | 4 | 2022-04-01 | 4 |
Je sais ce qui ne va pas mais je ne trouve pas de solution. Le problème vient de toutes les lignes vides du tableau t1.date
> "whatever"过滤了t1
. J'ai essayé cette méthode mais ça ne marche pas :
where `t1`.`date` > "2022-01-01" or `t1`.`date` = null
P粉2014488982023-09-08 19:22:14
Vous devriez utiliser
where `t1`.`date` > "2022-01-01" or `t1`.`date` is null
"NULL = NULL" est évalué à false car NULL n'a aucune valeur. Par conséquent, elle ne peut pas être identique à n’importe quelle autre valeur (même une autre valeur NULL). La bonne façon est d'utiliser is null
P粉7291982072023-09-08 17:50:08
Il semble que vous devriez utiliser t2.date > "2022-01-01"
dans les requêtes de jointure à droite.
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";
Voir la démo sur https://dbfiddle.uk/reo8UanD.