SQL Server 中的 Top 查询

3

我不知道这个查询有什么问题:

select * from products , top 1 * from pic 
where products.productId = pic.productId

我有产品和图片表,每个产品可以有1到n张图片,我想返回每个产品和它的第一张图片。
下面的图示可能会有所帮助: enter image description here

你得到了什么结果?你期望得到什么结果? - Oded
@Oded,关键字“top”附近语法有误。我想返回所有与其相关联的第一张图片的产品。 - Mostafa
我给比我的回答更好(在我看来)的回答点了赞,但现在它消失了? - MatBailie
@Dems:答案不会消失..它们只是暂时被删除了 :) - Akram Shahda
3个回答

3

你需要有一种独特的方式来标识每张图片,所以我假设该表格有一个ID列...

SELECT
  *
FROM
  products
LEFT JOIN
  pic
    ON pic.Id = (SELECT TOP 1 id FROM pic WHERE productID = products.ProductID ORDER BY id DESC)


编辑

受另一个回答的启发,改用APPLY方法...

SELECT
  *
FROM
  products
OUTER APPLY
  (SELECT TOP 1 * FROM pic WHERE productID = products.ProductID ORDER BY id DESC) AS pic

0

你需要使用子查询来:

  • 为每个ProductID选择第一个PicID
  • 与Pic表本身连接以获取其他列
  • 与Products连接以获取产品列

SQL语句

SELECT  *
FROM    Products prod
        LEFT OUTER JOIN Pic p ON p.ProductID = prod.ProductID
        LEFT OUTER JOIN (
          SELECT PicID = MIN(PicID)
                 , ProductID
          FROM   Pic
          GROUP BY
                 ProductID
        ) pm ON pm.PicID = p.PicID

如果有一个产品没有图片 - 你的脚本将无法捕捉到它。请改为LEFT JOIN。 - CristiC

0

还有一种方法是使用子部分,但请尽量避免在您的TSQL中使用子选择。

Select 
*
,(select top(1) adress from pic where pic.productid=products.id /* if u wanna you also can order by id */   ) as Id
from products 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接