2

テーブルで左結合を実行すると、右側のテーブルでさらに値が見つかったときに、左側のテーブルの結果が複製されます。右側のテーブルに複数の値がある場合でも、左側から個別の値のみを返すにはどうすればよいですか。(右側のテーブルに複数の画像がある場合でも、1つのムービーのみを返します)

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
4

2 に答える 2

3

通常、「適切なテーブル」からの結果が必要ない場合は、「適切なテーブル」を使用しません。

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')

(クエリに従って)一致する行がない行を作成するには、これを使用します

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

そうでなければ、あなたは私が理解できない「MovieImageから任意の行をください」と言っています...

その他の注意事項:

  • 常にNOLOCKを使用しないでください
  • テーブル名をスキーマ名(通常はdbo)で修飾します
于 2012-06-05T07:55:42.810 に答える
1

group by1つだけを選択したい場合は、を実行して、またはを選択してみませんmin()max()?画像があるかどうかに関係なく、すべての映画を取得するかどうかに応じて、を使用しleft joinます。画像付きの映画のみが必要な場合は、を使用してinner joinください。特定の数の画像を含む映画のみが必要な場合は、このhaving句を使用します。

簡略化した例:

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
于 2012-06-05T08:07:53.193 に答える