2011-10-25 4 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 서버로 작동하지 않습니다이에 대한 작업 FIRST 집계 함수가 없습니다. 아니면 그렇습니까?

더 간단한 해결책이 없으므로 top1로 내부 선택을해야합니까?

+4

는'FIRST'은 무엇의 지시로? –

+0

그림 ID로 주문합니다. – 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