SQL Join上的重复行

时间:2012-06-05 07:31:06

标签: sql sql-server

当我在表上执行左连接时,如果在右表中找到更多值,则会复制左表中的结果。 即使右表上有多个值,我怎么才能从左边返回不同的值。 (即使右表上有多个图像,也只返回一部电影)

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

2 个答案:

答案 0 :(得分: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)来限定您的表名称

答案 1 :(得分:1)

如果您只想选择一个,为什么不选择group by,然后选择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