1

私は2つのテーブルを持っています:

1) ブログアルバム:

Id  AlbumName   CoverPhoto          CreatedDate                    Description     
1   Onam        noImage.jpg     2012-07-05 10:54:46.977            Onam is an ancient festival which still survives in modern times. Kerala's rice harvest festival and the Festival of Rain Flowers, which fall on the Malayalam month of Chingam, celebrates the Asura King Mahabali's annual visit from Patala (the underworld). Onam is unique since Mahabali has been revered by the people of Kerala since prehistory.    According to the legend, Kerala witnessed its golden era during the reign of King Mahabali. The Brahma-Vaivarta Puranam explains that Lord Vishnu wante     
2   Birds       noImage.jpg     2012-07-05 11:02:48.667         
3   Nature    gold-fish.jpg     2012-07-05 11:03:36.503

2. ブログ写真:

    Id  AlbumId PhotoName                  AddedDate            
    29  1   Photo0364.jpg      2012-07-05 11:01:18.270          
    30  1   Photo0380.jpg      2012-07-05 11:01:35.723         
    31  1   Photo0404.jpg      2012-07-05 11:01:47.717          
    32  1   Photo0404.jpg      2012-07-05 11:02:34.457          
    33  2   f.jpg              2012-07-05 11:03:03.300          
    34  2   g.jpg              2012-07-05 11:03:12.917         
    35  3   image005.jpg       2012-07-05 11:03:45.367          
    36  3   1.jpg              2012-07-05 11:03:57.837          
    37  3   2.jpg              2012-07-05 11:04:05.580          
    38  3   na.jpg             2012-07-05 11:04:17.337          
    39  3   gold-fish.jpg      2012-07-05 11:06:29.453

BlogPhoto の詳細を一覧表示するストアド プロシージャを作成しました。

ALTER PROCEDURE [dbo].[BlogPhotoDetailsById]
    (
        @Id int
    )
    AS
    BEGIN
        SELECT [HRM_BlogPhoto].[Id] 
              ,[HRM_BlogPhoto].[AlbumId] 
              ,[HRM_BlogPhoto].[PhotoName] 
              ,[HRM_BlogPhoto].[AddedDate] 
              ,[HRM_BlogPhoto].[Title] 
              ,[HRM_BlogPhoto].[ModifiedDate]
          FROM [HRM_BlogPhoto] 
        WHERE [HRM_BlogPhoto].[Id] = @Id 

    END

私が望むのは、BlogPhoto.PhotoName が BlogAlbum.CoverPhoto と等しい場合、上記のストアドプロシージャで「true」を表示する必要があり、そうでない場合は「false」を表示する必要があるということです。

上記のストアド プロシージャを変更するにはどうすればよいですか。

4

1 に答える 1

1

以下は、BlogPhoto が少なくとも 1 つの BlogAlbum の CoverPhoto であるかどうかを表示します (写真が複数のアルバムに含まれている可能性があることに注意してください)。

ALTER PROCEDURE [dbo].[BlogPhotoDetailsById] ( @Id int ) AS BEGIN SELECT [HRM_BlogPhoto].[Id] ,[HRM_BlogPhoto].[AlbumId] ,[HRM_BlogPhoto].[PhotoName] ,[HRM_BlogPhoto].[AddedDate] ,[ HRM_BlogPhoto].[Title] ,[HRM_BlogPhoto].[ModifiedDate] ,CASE WHEN EXISTS (SELECT * FROM [blogalbum] WHERE [blogalbum].CoverPhoto = [HRM_BlogPhoto].[PhotoName] ) THEN 'true' ELSE 'false' END AS [IsCoverPhoto] FROM [HRM_BlogPhoto] WHERE [HRM_BlogPhoto].[Id] = @Id

編集

ベナーの指摘が採用されています。以下はネストされたループを回避しますが、カバー写真が重複する可能性があるため、distinct キーワードを追加する必要があることに注意してください。

ALTER PROCEDURE [dbo].[BlogPhotoDetailsById]
(
    @Id int
)
AS
BEGIN
    SELECT DISTINCT 
          [HRM_BlogPhoto].[Id]
          ,[HRM_BlogPhoto].[AlbumId] 
          ,[HRM_BlogPhoto].[PhotoName] 
          ,[HRM_BlogPhoto].[AddedDate] 
          ,[HRM_BlogPhoto].[Title] 
          ,[HRM_BlogPhoto].[ModifiedDate]
          ,CASE WHEN [blogalbum].CoverPhoto IS NOT NULL
             THEN 'true' 
             ELSE 'false' 
           END AS [IsCoverPhoto]
      FROM [HRM_BlogPhoto] 
            LEFT OUTER JOIN [blogalbum]
            ON [blogalbum].CoverPhoto = [HRM_BlogPhoto].[PhotoName]
    WHERE [HRM_BlogPhoto].[Id] = @Id     

1 つの注意点 - パフォーマンス上の理由から、この方法を使用する場合は [blogalbum].CoverPhoto にインデックスを作成する必要があります。

于 2012-07-06T05:30:51.553 に答える