SQL Server GROUP BY и FIRST - PullRequest
       3

SQL Server GROUP BY и FIRST

1 голос
/ 25 октября 2011

У меня много объектов галереи.У меня много картинок.Изображения находятся в галереях.

Я хочу создать представление, в котором я перечисляю галереи и некоторые свойства первого изображения в галерее.

Что-то вроде:

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 нет работающей агрегатной функции FIRST.Или это так?

Или я должен сделать внутренний выбор с помощью top1, так как нет более простого решения?

1 Ответ

3 голосов
/ 25 октября 2011

Вот один из способов.

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  
...