recherche

Maison  >  Questions et réponses  >  le corps du texte

L'instruction "where" dans MySQL interrompra la connexion complète

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粉141925181P粉141925181450 Il y a quelques jours589

répondre à tous(2)je répondrai

  • P粉201448898

    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

    répondre
    0
  • P粉729198207

    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.

    répondre
    0
  • Annulerrépondre