Comment sélectionner un enregistrement dans une jointure gauche
J'ai besoin de sélectionner un modèle spécifique à partir des Modèles de table à l'aide de sa clé ModelID. J'ai aussi besoin d'ajouter un texte de présentation de contenu à partir de la Model_Content table. Le Models_Content tableau, cependant, dispose de plusieurs notices de contenu pour chaque modèle. J'ai besoin de sélectionner juste la première blurb.
Mes tables ressembler à ceci:
Models // table
ModelID // pk
Model // varchar
Models_Content // table
ContentID // pk
ModelID // fk
Content // varchar
SELECT M.ModelID, M.Model, C.Content
FROM Models M LEFT JOIN Models_Content C ON M.ModelID = C.ModelID
WHERE M.ModelID = 5
Comment puis-je régler ma requête pour sélectionner juste le tout premier texte de présentation de contenu pour un modèle spécifique?
- "D'abord" est un avec plus bas
ContentID
? - oui. Le plus bas ContentID sera celui que je veux.
Vous devez vous connecter pour publier un commentaire.
Ou
(ModelID, ContentId)
sur Models_Content.De Sean réponse est la meilleure solution mais juste pour ajouter un autre "généralisée" de la solution
Models_Content
pour un Modèle en particulier. Le nom général pour ce type de requête est "le Plus grand n par groupe". Itzik Ben Gan explique certaines approches iciAPPLY
's RBARness (je suis en train de faire plus de mots jusqu'à aujourd'hui, que je charge le comte) dépend de la requête? J'ai souvent vu des cas où l'application d'une ligne de table d'une valeur de la fonction pour être extrêmement efficace.TOP 1
fonctionne très bien avec l'actuelle clause where, mais ne pas généraliser à plusieurs modèles à la fois.Changer votre
JOIN
à:LEFT JOIN (SELECT ModelID, MAX(Content) as Content FROM Models_Content GROUP BY ModelID)
C'est en supposant que vous n'avez pas de soins qui
Content
que vous obtenez.vous pouvez sélectionner le
MIN ( contentID )
Cela peut être une extension sur Randy réponse, mais il n'est pas complètement clair pour moi.
Pour des raisons de performances, je voulais minimiser le nombre de
SELECT
états dans ma requête, j'ai donc utilisé uneMIN
de la déclaration dans le primaire sélectionner au lieu de l'intérieur de laJOIN
:Il peut y avoir des compromis en fonction de la quantité totale de données. IDK. Ma requête doit tunnel dans les données d'un problème en plusieurs étapes supprimé.
Content
champ n'est pas dans votre sous-requête.