it-swarm.com.de

So wählen Sie einen einzelnen Datensatz in einer linken Verknüpfung aus

Ich muss ein bestimmtes Modell aus der Tabelle "Modelle" auswählen und dabei dessen Schlüssel ModelID verwenden. Ich muss auch einen Inhalt aus der Model_Content-Tabelle hinzufügen. Die Models_Content-Tabelle enthält jedoch für jedes Modell mehrere Inhalte. Ich muss nur den ersten Klappentext auswählen.

Meine Tische sehen so aus:

 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

Wie stelle ich meine Abfrage so ein, dass nur der allererste Inhalt für ein bestimmtes Modell ausgewählt wird?

22
Evik James
 SELECT
   M.ModelID, M.Model, C.Content
 FROM
   Models M
 LEFT JOIN
   Models_Content C
     ON C.ContentID = (SELECT MIN(ContentID) FROM Models_Content WHERE ModelID = M.ModelID)
 WHERE
   M.ModelID = 5

Oder

;WITH sorted_content AS
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY ModelID ORDER BY ContentID) AS itemID,
    *
  FROM
    Models_Content
)
 SELECT
   M.ModelID, M.Model, C.Content
 FROM
   Models M
 LEFT JOIN
   sorted_content C
     ON  C.ModelID = M.ModelID
     AND C.itemID  = 1
 WHERE
   M.ModelID = 5
40
MatBailie

Seans Antwort ist die beste spezifische Lösung, nur um eine weitere "generalisierte" Lösung hinzuzufügen

SELECT M.ModelID,
       M.Model,
       C.Content
FROM   Models M
       OUTER APPLY (SELECT TOP 1 *
                    FROM   Models_Content C
                    WHERE  M.ModelID = C.ModelID
                    ORDER  BY C.ContentID ASC) C
WHERE  M.ModelID = 5  
9
Martin Smith
 SELECT TOP 1 M.ModelID, M.Model, C.Content
 FROM   Models M LEFT JOIN Models_Content C ON M.ModelID =  C.ModelID
 WHERE      M.ModelID = 5
 ORDER BY C.ContentID ASC
4
Sean

Ändern Sie Ihr JOIN in:

LEFT JOIN (SELECT ModelID, MAX(Content) as Content FROM Models_Content GROUP BY ModelID)

Dies setzt voraus, dass es Ihnen egal ist, welches Content Sie erhalten.

1
JNK

Dies kann eine Erweiterung von Randy Antwort sein, aber mir ist nicht ganz klar.  

Aus Gründen der Performance wollte ich die Anzahl der SELECT-Anweisungen in meiner Abfrage minimieren, daher habe ich eine MIN-Anweisung innerhalb des primären select anstelle der JOIN-Anweisung verwendet:

SELECT 
    table_1.id AS id, 
    table_1.name AS name,
    MIN(table_2.id) AS table_2_id 
FROM table_1
LEFT JOIN table_2 ON table_2.table_1_id = table_1.id
-- additional JOINs and WHERE excluded
GROUP BY table_1.id, table_1.name
LIMIT 5

Abhängig von der Gesamtdatenmenge kann es zu Kompromissen kommen. IDK. Meine Abfrage muss aus einer Bedingung, die mehrere Schritte entfernt wurde, in die Daten getunnelt werden.

0
mbrakken

sie könnten die MIN ( contentID ) auswählen

0
Randy