2 Stimmen

Doppelte Zeilen beim SQL-Join

Wenn ich eine linke Verknüpfung mit einer Tabelle durchführe, werden die Ergebnisse aus der linken Tabelle dupliziert, wenn mehr Werte in der rechten Tabelle gefunden werden. Wie kann ich nur die eindeutigen Werte aus der linken Tabelle zurückgeben, auch wenn es mehrere Werte in der rechten Tabelle gibt? (nur den einen Film zurückgeben, auch wenn es mehrere Bilder in der rechten Tabelle gibt)

SELECT
    *
FROM
    Movie AS M
    LEFT JOIN MovieImage AS MI WITH (
        NOLOCK
) ON M.TheMovieDbId = MI.TheMovieDbId
WHERE
    MI.ImageType = 'Poster'
    AND MI.ImageSize = 'Thumb'
    OR MI.ImageType IS NULL

3voto

gbn Punkte 407102

Normalerweise würden Sie eine "richtige Tabelle" nicht verwenden, wenn Sie keine Ergebnisse von ihr wollen.

SELECT 
     *
FROM 
    Movie AS M
WHERE
    EXISTS (SELECT *
      FROM
          MovieImage AS MI
      WHERE  
          M.TheMovieDbId = MI.TheMovieDbId
          AND
          MI.ImageType = 'Poster'
          AND 
          MI.ImageSize = 'Thumb')

Um Zeilen zu haben, in denen keine Zeilen übereinstimmen (wie in Ihrer Abfrage), verwenden Sie Folgendes

SELECT 
     *
FROM 
    Movie AS M
WHERE
    EXISTS (SELECT *
      FROM
          MovieImage AS MI
      WHERE  
          M.TheMovieDbId = MI.TheMovieDbId
          AND
          MI.ImageType = 'Poster'
          AND 
          MI.ImageSize = 'Thumb')
UNION
SELECT * FROM Movie

Andernfalls sagen Sie "geben Sie mir eine beliebige Zeile aus MovieImage", die ich nie verstehen ...

Sonstige Anmerkungen:

  • NOLOCK nicht immer verwenden
  • Qualifizieren Sie Ihre Tabellennamen mit dem Schemanamen (normalerweise dbo)

1voto

Asok Punkte 96

Wenn Sie sich nur für einen entscheiden wollen, warum machen Sie nicht einfach eine group by und wählen Sie min() o max() ? Je nachdem, ob Sie alle Filme abrufen möchten, unabhängig davon, ob sie ein Bild haben oder nicht, verwenden Sie die left join . Wenn Sie nur die Filme mit Bildern haben wollen, verwenden Sie inner join . Wenn Sie nur die Filme mit einer bestimmten Anzahl von Bildern sehen möchten, verwenden Sie die Option having Klausel.

Vereinfachtes Beispiel:

Select M.Name, isnull(max(MI.ImageName), 'No Image')
From Movie M
Left Join MovieImage MI
On M.TheMovieDbId = MI.TheMovieDbId
Group By M.Name

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X