De nombreux exemples se trouvent sur les jointures SQL basées sur des valeurs min / max, mais ma base de données ne prend PAS en charge la fonction TOP
et de nombreuses solutions semblent être destinées à l'utiliser. J'ai du mal à comprendre, donc à essayer avec une simple requête.
select a.custID, b.lineNO, b.comment from CUSTOMER a left join COMMENT b on a.custID = b.comcustID
J'ai ici une relation un-à-plusieurs avec un seul a.custID
, mais plusieurs b.comment
. Comment puis-je JOIN
une seule valeur b.comment
qui a max
(b.lineNO)
Aucun problème pour faire cela via la fonction d'agrégation MAX
basée sur cet exemple, mais un besoin d'exécuter (min / max) JOIN
a tendance à apparaître de temps en temps et J'aimerais comprendre comment écrire une requête comme celle-là. Ce qui est meilleur pour les performances, en joignant une seule valeur min / max ou en exécutant une fonction d'agrégation telle que MAX
?
Malheureusement, je ne suis pas sûr du moteur de base de données réel, mais j'ai trouvé TOP
comme première fonction à ne pas fonctionner à partir de choses basiques. Bonne chance, c'est quelque chose d'IBM. Merci!
4 Réponses :
Comme les gens l'ont commenté, vous avez vraiment besoin de savoir quelle base de données vous utilisez. Mais pour une solution rapide maintenant ...
SELECT a.custID, b.lineNO, b.comment FROM CUSTOMER a LEFT JOIN COMMENT b on a.custID = b.comcustID AND b.lineNO = (SELECT MAX(b.lineNO) FROM COMMENT b WHERE a.custID = b.comcustID)
Merci, a très bien fonctionné. Ressenti également comme le plus simple à mettre en œuvre
Veuillez vérifier la réponse ci-dessous:
select a.custID, b.lineNO, b.comment from CUSTOMER a left join comment b on a.custID = b.comcustID and b.bLineNo = (select max(bLineNo) from customer cin where cin.comcustID = b.comcustID)
J'ai travaillé avec celui de Nigel. Merci!
quel est le problème?
J'ai ici une relation un-à-plusieurs avec un seul a.custID, mais plusieurs b.comment. Comment puis-je REJOINDRE une seule valeur b.comment qui a max (b.lineNO)
Je suppose que vous voulez:
SELECT a.custID, c.lineNO, c.comment FROM CUSTOMER a INNER JOIN ( SELECT comcustID, MAX(lineNO) as max_line_no FROM COMMENTS GROUP BY comcustID ) b ON b.comcustID = a.custID INNER JOIN COMMENTS c ON c.comcustID = b.comcustID AND c.lineNO = b.max_line_noNB: vous n'avez pas tagué le SGBDR que vous utilisez. La requête ci-dessus utilise un langage SQL courant, qui est pris en charge par la plupart des SGBDR (mysql, sqlite, oracle, mssql, postgres, ...)
Une autre méthode utilise les fonctions de fenêtre:
select cu.custID, co.lineNO, co.comment from CUSTOMER cu left join (select co.*, row_number() over (partition by co.comcustID order by co.lineNO desc) as seqnum from COMMENT co ) co on cu.custID = co.comcustID and co.seqnum = 1;
Veuillez découvrir quel moteur de base de données vous utilisez. Voter pour fermer, sinon.
DB2 ou Netezza vous dit-il quelque chose?