0
votes

Cas de MySQL ne renvoyant pas la valeur attendue sur NULL

J'ai la requête suivante: xxx pré>

Je m'attends à t2.hasorders code> soit true code> ou false après le cas code> partie de la partie code> rejoindre gauche code> mais je continue à obtenir true code> ou null code> comme démontré ici p>

Je sais que t2.date code> retournera toujours une date valide ou la valeur de colonne par défaut de 0000-00-00 code>. p>

Il s'agit d'une version simplifiée de ma requête en tant que table Joindre gauche code> est une table temporaire. P>

Pourquoi null code> valeurs pour t2.date code> ne renvoie pas mon résultat attendu?

Merci d'avance. p>

EDIT 1 FORT> P>

Lien vers démonstation - Supprimé où code> une partie de la requête

EDIT 2 STRT> P>

Résultat attendu: P>

 id     collection_date     last_order_date     hasOrders
1001    2019-02-07          2019-02-01          true
1002    2019-02-09          NULL                NULL


4 commentaires

Je ne suis pas encore sûr du comportement vrai / null, mais ma question est-elle - qu'est-ce que vous essayez réellement d'atteindre? Je ne sais pas ce que la fonction 'Max' avec dans la table Sales_orders devrait vraiment faire ... Si vous ne vouliez que voir la dernière commande pour chaque travail / date, je pense que vous devez appliquer le max sur la déclaration extérieure. BTW., Comme les réponses ci-dessous - lorsque vous utilisez des fonctions agrégées telles que 'Max', je pense également que vous devriez utiliser une déclaration "Groupe par".


@Erikreder J'ai un groupe dans la requête réelle, il a été laissé par erreur lorsque je l'ai simplifié pour la question.


@Erikreder La fonction max est utilisée pour créer une table temporaire utilisée dans la requête réelle, car il y a beaucoup de données et la requête prenne trop de temps.


Je pense donc que le problème est que la table Sales_order n'a pas d'entrée sur ID 1002. Votre table temporaire ressemble donc à 1001 2019-02-01 True -> Seulement une ligne. Donc, pour l'ID 1002, la table de gauche ne trouvera rien à rejoindre et de mettre donc des valeurs nulles.


3 Réponses :


1
votes

Vous devez déplacer le boîtier lorsque vous êtes sur la requête extérieure depuis le boîtier interne lorsqu'il ne serait jamais exécuté lorsqu'il n'y a pas de lignes dans Sales_orders CODE>

SELECT  t1.id,
    t1.collection_date,
    COALESCE(t2.last_order_date, '0001-01-01') order_date,
    CASE COALESCE(t2.last_order_date, '0001-01-01') 
      WHEN '0001-01-01' THEN 'false' 
      ELSE 'true' 
    END flag
FROM job_details AS t1
LEFT JOIN
  (SELECT  job_id, MAX(date) AS last_order_date
   FROM sales_orders
   GROUP BY job_id
  ) AS t2
 ON t2.job_id = t1.id


2 commentaires

Ma requête actuelle utilise le groupe d'ici à gauche, j'ai raté la démo (désolé). J'ai essayé de changer les dates comme suggéré, mais obtenez les mêmes résultats.


Merci. Je pense que j'ai mal compris à quel point les jointures ont travaillé. Faire cela fonctionnerait si les données devaient être traitées / affichées, mais j'espérais utiliser le résultat vrai / faux de la partie de la pièce dans un relevé, mais cela ne serait pas possible car ce serait un alias.



0
votes

Vous devez mettre t1.collection_date comme pour job_id 1002 date est '2019-02-09' code>

SELECT  t1.id,
        t1.collection_date,
        t2.order_date,
        t2.hasOrders
FROM job_details AS t1
    LEFT JOIN
        (
        SELECT  job_id, 
                MAX(date) AS order_date,
                (CASE COALESCE(MAX(date), '0000-00-00') WHEN '0000-00-00' THEN 'false' ELSE 'true' END) AS hasOrders
        FROM sales_orders group by job_id
        )
    AS t2
    ON t2.job_id = t1.id
WHERE t1.collection_date <= '2019-02-09'


3 commentaires

Désolé, j'ai édité la démo. La déclaration aurait dû être là.


pouvez-vous s'il vous plaît ajouter votre sortie attendue @gavin


J'ai ajouté les résultats attendus et réels



1
votes

Je pense en déplaçant le «max» et en groupe vers la déclaration extérieure, la logique devrait au moins fonctionner correctement (besoin d'ajouter la déclaration «Coalesce» si vous souhaitez également calculer cette colonne). Pas sûr de la performance sage, mais je verrais d'abord si le résultat est généralement bien. J'espère que la syntaxe va bien, n'a pas été testée. XXX


1 commentaires

Hmm, vient de remarquer la réponse de Joakim ci-dessous, ce qui est probablement mieux tel qu'il contient la déclaration de coalesce déjà. Regarde bien pour moi. Quoi qu'il en soit, essayez peut-être la version simple ci-dessus, puis optez pour la solution complète.