1
votes

SQL JOIN valeur unique sans fonction TOP

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!


2 commentaires

Veuillez découvrir quel moteur de base de données vous utilisez. Voter pour fermer, sinon.


DB2 ou Netezza vous dit-il quelque chose?


4 Réponses :


0
votes

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)


1 commentaires

Merci, a très bien fonctionné. Ressenti également comme le plus simple à mettre en œuvre



1
votes

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) 


2 commentaires

J'ai travaillé avec celui de Nigel. Merci!


quel est le problème?



1
votes

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_no

NB: 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, ...)


0 commentaires

0
votes

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;


0 commentaires