2011-10-25 127 views
1

我有很多圖庫對象。我有很多照片。照片在畫廊裏。SQL Server GROUP BY和FIRST

我想創建一個視圖,列出庫中第一張圖片的圖庫和一些屬性。

喜歡的東西:

ALTER VIEW [foto].[gallery_with_picture]  
AS 
select 
     main.* 
     ,FIRST(pics.[picture_id]) 
     ,FIRST(pics.[picture_width]) 
     ,FIRST(pics.[picture_height]) 
     ,FIRST(pics.[URLPart] as picture_url_part) 
     ,FIRST(pics.[Extension] as picture_extension) 
    from 
     [v_gallery] main 
     left join [v_picture_recursive] pics on main.[foto_reference_picture_group_modeling_object/obj_id] = pics.woc_root 
    group by 
     main.* 
    order by 
     pics.[picture_id] 

當然,這並不能作爲SQL Server的工作對這個沒有工作的第一聚集的功能。還是呢?

或者我應該做一個top1的內部選擇,因爲沒有更簡單的解決方案?

+4

'FIRST'通過什麼命令? –

+0

按圖片編號排序。 – SoonDead

+0

SQL表中沒有固有的順序。您需要指定您如何定義訂單。 – JNK

回答

3

這是一種方法。

ALTER VIEW [foto].[gallery_with_picture] 
AS 
SELECT main.*, /*But best to list columns explicitly*/ 
     pics.[picture_id], 
     pics.[picture_width], 
     pics.[picture_height], 
     pics.[URLPart] AS picture_url_part, 
     pics.[Extension] AS picture_extension 
FROM [v_gallery] main 
     OUTER APPLY 
     (SELECT TOP 1 * 
     FROM [v_picture_recursive] pics 
     WHERE main.[foto_reference_picture_group_modeling_object/obj_id] = 
       pics.woc_root 
     ORDER BY pics.[picture_id]) pics 

或者其他

ALTER VIEW [foto].[gallery_with_picture] 
AS 
WITH pics AS ( 
SELECT *, 
     ROW_NUMBER() OVER (PARTITION BY woc_root 
           ORDER BY [picture_id]) RN 
FROM [v_picture_recursive]) 
SELECT main.*, 
     pics.[picture_id], 
     pics.[picture_width], 
     pics.[picture_height], 
     pics.[URLPart] AS picture_url_part, 
     pics.[Extension] AS picture_extension 
FROM [v_gallery] main 
     LEFT JOIN pics 
     ON main.[foto_reference_picture_group_modeling_object/obj_id] = 
      pics.woc_root 
      AND RN = 1 
+0

謝謝你的答案似乎工作正常! – SoonDead