2011-05-23 74 views
3

我不知道这有什么错此查询:SQL Server的顶部查询

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

我对我们的产品和PIC表,每个产品可以有1到n知情同意,我想回到每一个产品和那

第一张图图的图片可以帮助enter image description here

+0

你会得到什么结果?你期待什么结果? – Oded 2011-05-23 13:13:05

+0

@Oded,关键字'top'附近的语法不正确。我想用与它相关的第一张图片返回所有产品 – Mostafa 2011-05-23 13:14:14

+0

我提出了比我的更好的答案(在我看来),但现在它消失了? – MatBailie 2011-05-23 13:41:10

回答

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) 


编辑

另一个答案的启发,采用适用,而不是...

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

谢谢!这工作。 – Mostafa 2011-05-23 13:21:34

0

你需要一个子查询

  • 选择第一PicID的每个产品ID
  • 加入事先知情同意表本身来获得额外的列
  • 加入的产品,以获得产品列

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 
+0

如果没有图片的产品 - 您的脚本将无法捕捉它。更改为左加入 – CristiC 2011-05-23 13:18:03

+0

@Parkyprg - 你是对的,我已将它改为左边。 – 2011-05-23 13:29:38

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