2012-07-06 152 views
1

我有两个表:获取布尔值

1)BlogAlbum:

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

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,再在上面StoredProcedure的我需要显示“真”,如果没有我需要显示“假”。

我怎么能修改上面的存储过程?

+0

你需要“真”与“假”打印到控制台,或者你想一个'HasCoverPhoto'列添加到您的存储过程的输出? – Arithmomaniac 2012-07-06 05:30:07

回答

1

的下面将显示BlogPhoto是否为至少一个BlogAlbum(注意,相片可以是在一个以上的专辑)

ALTER PROCEDURE [DBO]的CoverPhoto。[BlogPhotoDetailsById] ( @Id INT ) AS BEGIN SELECT [HRM_BlogPhoto]。[ID] ,[HRM_BlogPhoto] [ALBUMID] ,[HRM_BlogPhoto] [PhotoName] ,[HRM_BlogPhoto] [AddedDate] ,[ HRM_BlogPho到]。[标题] ,[HRM_BlogPhoto] [ModifiedDate] ,CASE WHEN EXISTS (SELECT * FROM [blogalbum] WHERE [blogalbum] .CoverPhoto = [HRM_BlogPhoto]。[PhotoName] ) THEN '真' ELSE '假' END AS [IsCoverPhoto] FROM [HRM_BlogPhoto] WHERE [HRM_BlogPhoto]。[ID] = @Id

编辑

Bennor的点被取。下面将避免嵌套循环,尽管注意由于重复封面照片的潜力,您需要添加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  

一个警告 - 由于性能原因,你应该确保你有[blogalbum] .CoverPhoto如果用这种方法去索引。

+1

在这样的选择中嵌套查询几乎不是一个好主意。这里不会是一个巨大的性能问题,因为外部查询是一个直接的PK查找,但它鼓励一个坏习惯。如果有人出现并复制查询,但将where子句删除,则会产生性能恶梦。 – 2012-07-06 05:41:04

+1

谢谢nonnb。您的查询符合我的要求。 – Ramdas 2012-07-06 06:11:02

+0

谢谢你帮我解决这个 – Ramdas 2012-07-06 06:11:52