6
votes

Comportement étrange avec pas dans

J'ai cette table: xxx

J'ai cette requête: xxx

mais quand je change la requête en non Dans Il renvoie un ensemble vide: xxx

Comment est-ce possible? Si la sous-requête contient environ la moitié des enregistrements, le pas de la sous-requête contient l'autre moitié? Qu'est-ce que je manque ici?

merci


7 commentaires

Essayez SELECT Count (*), Comptez (1) de Tbl_1 ...


Avez-vous des nuls dans la colonne? Qu'est-ce que comptez (*) de tbl_1 où Clean_deep_link est NULL retour?


Ou en d'autres termes, il y a trois moitiés dans une table SQL.


@vyegorov - cela retourne toujours 0,0


@ypercube - Sélectionnez Count (*) à partir de tbl_1 où Clean_deep_Link est NULL_DEEP_LINK EST NULL Retours 0. Il n'y a pas de NULL IN LIEU.


S'il vous plaît, affichez les deux définitions de table.


Vous avez probablement foiré ce que vous courez et ce que vous montrez. S'il vous plaît essayez ceci et postez les résultats dans la question: SELECT Count (*), COUNT (CLEAN_DEEP_LINK), COUNT (CLEAN_DEEP_LINK), COUNT (CLEORE_DEEP_LINK EST NULL) à partir de TBL_1 (et de même pour < Code> tbl_2 )


3 Réponses :


9
votes

Je supposerais que tbl_1.clean_deep_link est null pour le reste des lignes.

Ces valeurs ne sont ni dans ni < Code> Pas dans Votre sous-requête.


L'autre raison pourrait être, que vous avez null dans tbl_2.clean_deep_link .

Veuillez essayer ce qui suit: xxx

Le problème avec null est-ce que ce n'est ni = < / code>, ni <> toute autre valeur (y compris null ).

Lorsque vous vérifiez pas dans , mysql doit vérifier chaque valeur dans tbl_1 qu'il n'est pas contenu dans tbl_2 et vérifie donc si elles sont <> << p> Vos valeurs étaient non <> null , ils étaient donc pas pas dans . < p> Voir aussi: Utiliser non dans l'opérateur avec des valeurs NULL


contrôle de contrôle dans SQL Fiddle .


3 commentaires

Oui, il y avait un seul disque dans tbl_2 qui avait null pour nettoyer_deep_link ... Quand j'avais supprimé cet enregistrement, la sous-requête a bien fonctionné. Comment cela aurait-il pu le causer?


J'ai essayé de l'expliquer dans ma mise à jour récente, espérons que ce n'est pas trop déroutant;) envisagez de mettre un non null contrainte sur tbl_2.clean_deep_link pour éviter ce problème.


Merci. Je ne peux pas comprendre la justification derrière cela, mais je garderai cela à l'esprit.



2
votes

Le null Colonnes de MySQL sont comptés comme étant distincts, alors trois null sont tous considérés comme distincts.

Comme mentionné ailleurs, vous ne pouvez pas comparer < Code> NULL contre d'autres valeurs à l'aide des opérateurs de comparaison conventionnels, parmi lesquels dans et pas dans .

Les opérateurs suivants peuvent gérer NULL valeurs xxx


0 commentaires

0
votes
SELECT COUNT(*) - COUNT(1) 
FROM tbl_1 
WHERE clean_deep_link IN (
    SELECT clean_deep_link 
    FROM tbl_2
);

0 commentaires