J'ai cette table: J'ai cette requête: p> mais quand je change la requête en Comment est-ce possible? Si la sous-requête contient environ la moitié des enregistrements, le merci p> p> non Dans CODE> Il renvoie un ensemble vide: p> pas code> de la sous-requête contient l'autre moitié? Qu'est-ce que je manque ici? P>
3 Réponses :
Je supposerais que Ces valeurs ne sont ni L'autre raison pourrait être, que vous avez Veuillez essayer ce qui suit: p> Le problème avec Lorsque vous vérifiez contrôle de contrôle dans SQL Fiddle . p> p> tbl_1.clean_deep_link code> est null code> pour le reste des lignes. dans code> ni < Code> Pas dans Code> Votre sous-requête. P>
null code> dans tbl_2.clean_deep_link code >. p> null code> est-ce que ce n'est ni = < / code>, ni <> code> toute autre valeur (y compris null code>). p> pas dans code>, mysql doit vérifier chaque valeur dans tbl_1 code> qu'il n'est pas contenu dans tbl_2 code> et vérifie donc si elles sont <> p> << p> Vos valeurs étaient <> null code>, ils étaient donc pas dans code>. p> < p> Voir aussi: Utiliser non dans l'opérateur avec des valeurs NULL a> p>
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 code> contrainte sur tbl_2.clean_deep_link code> pour éviter ce problème.
Merci. Je ne peux pas comprendre la justification derrière cela, mais je garderai cela à l'esprit.
Le Comme mentionné ailleurs, vous ne pouvez pas comparer < Code> NULL code> contre d'autres valeurs à l'aide des opérateurs de comparaison conventionnels, parmi lesquels Les opérateurs suivants peuvent gérer null code> Colonnes de MySQL sont comptés comme étant distincts, alors trois null code> sont tous considérés comme distincts. dans code> et pas dans code>. p> NULL code> valeurs p>
SELECT COUNT(*) - COUNT(1)
FROM tbl_1
WHERE clean_deep_link IN (
SELECT clean_deep_link
FROM tbl_2
);
Essayez
SELECT Count (*), Comptez (1) de Tbl_1 ... Code>Avez-vous des nuls dans la colonne? Qu'est-ce que
comptez (*) de tbl_1 où Clean_deep_link est NULL code> 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 CODE> 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 CODE> (et de même pour < Code> tbl_2 code>)