【问题标题】:SQL Select with 3 tables带有 3 个表的 SQL 选择
【发布时间】:2016-01-18 15:44:50
【问题描述】:

我有一个问题。我有 3 个表格,一个包含视频列表,另一个包含类别列表,第三个告诉我每个视频所在的类别。 我想列出所有类别,但我需要使用每个类别中插入的最后一个视频的缩略图。 该列表必须显示类别的名称和插入该类别的最后一个视频的缩略图。我希望我说清楚了。

  • Videos(Id, Name, Description, Duration, Date, Thumbnail, Active )
  • Categories(Id, Cat, Active)
  • VidCat(Id, Video, Cat)

我尝试使用下面的表达式但不起作用。它显示了我拥有的所有缩略图。

SELECT DISTINCT C.[Id], C.Cat, V.[Codigo]
FROM [Categories] AS C 
left JOIN [VidCat] AS VC ON C.[Id] = VC.[Cat] 
left JOIN [Videos] AS V ON VC.[Video] = V.[Id] 
WHERE (C.[Active] = 1)

也试过了,结果一样。

SELECT DISTINCT C.[Id], C.Cat, V.[Thumbnail]
FROM [Categories] AS C 
left JOIN [VidCat] AS VC ON C.[Id] = VC.[Cat] 
left JOIN [Videos] AS V ON VC.[Video] = V.[Id] 
WHERE (C.[Active] = 1)
AND (V.[Thumbnail] IN (SELECT distinct [Thumbnail] FROM [Videos] WHERE VC.[Video] = [Id] ORDER BY [Date] DESC))
ORDER BY P.[Id]

非常感谢。

贝托

【问题讨论】:

  • V.[Thumbnail]condition 从 WHERE 移动到 ON 以获得真正的 LEFT JOIN 行为,因为现在您可以获得常规的内部连接结果。
  • 另外,不需要在子查询中选择DISTINCT

标签: sql sql-server select join


【解决方案1】:

您可以为此目的使用相关子查询或outer apply

select c.*, v.*
from categories c outer apply
     (select top 1 v.*
      from vidcat vc join
           videos v
           on vc.video = v.id
      where vc.cat = c.id
      order by v.date desc
     ) v;

虽然这可以使用joins 和其他SQL 构造(例如row_number())来表达,但这可能是最简单、最快的方法——尤其是使用正确的索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 2017-09-18
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多