2

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

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

如果您只想选择一个,为什么不直接执行 a group by,然后选择min()or 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 回答