2011-05-23 121 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