J'ai la requête suivante: Je m'attends à Je sais que Il s'agit d'une version simplifiée de ma requête en tant que table Pourquoi Merci d'avance. p> Lien vers démonstation - Supprimé EDIT 2 STRT> P> Résultat attendu: P> 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>
t2.date code> retournera toujours une date valide ou la valeur de colonne par défaut de
0000-00-00 code>. p>
Joindre gauche code> est une table temporaire. P>
null code> valeurs pour
t2.date code> ne renvoie pas mon résultat attendu?
où code> une partie de la requête
id collection_date last_order_date hasOrders
1001 2019-02-07 2019-02-01 true
1002 2019-02-09 NULL NULL
3 Réponses :
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
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.
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'
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
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.
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.
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.