2011-10-25 18 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は、このための作業FIRST集計機能を持っていないとして、これは動作しません。それとも?

また、単純な解決策がないため、トップ1でインナーセレクトを行う必要がありますか?

+4

'FIRST'何で順序付けられましたか? –

+0

画像IDで指定します。 – SoonDead

+0

SQLテーブルには固有の順序はありません。指図の定義方法を指定する必要があります。 – JNK

答えて

3

ここには1つの方法があります。

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