1

我有几个与多语言照片库相关的表格,例如

  • 专辑类别
  • 专辑名称
  • 相片
  • 照片详情

两个表的示例表结构。我实际上想要一个结果集,它将显示表中所有记录的列表,以及一个自定义列,该列将显示或基于表中是否存在特定Photos的PhotoIDAlbumIDTRUEFALSEPhotoDetails

   Table: Photos
    PhotoID PhotoFile   AlbumID
    1       Photo1.jpg  7
    2       Photo2.jpg  7
    3       Photo3.jpg  5
    4       Photo4.jpg  5
    5       Photo5.jpg  7
    6       Photo6.jpg  7


Table: PhotoDetails
PDID        PhotoID     PDTitle     AlbumID     LanguageID
11      1       Photo 1     7       1
22      2       Photo 2     7       1
33      3       Photo 3     5       1
44      4       Photo 4     5       1


    DESIRED OUT PUT
    PhotoID PDTitle     AlbumID     DetailPresent
    1       Photo1      7       TRUE
    2       Photo2      7       TRUE
    5       Photo5      7       FALSE
    6       Photo6      7       FALSE

我尝试了几个基于 JOIN 的查询,但无法获得所需的结果

SELECT pd.PhotoTitle, p.PhotoTN,p.PhotoCreatedOn, pd.AlbumID, ISNULL(p.PhotoID,NULL) AS Missing FROM AlbumPhotos p 
  JOIN AlbumPhotoDetails pd
  ON p.PhotoID = pd.PhotoID WHERE pd.AlbumID = 16

这个查询给了我同样的结果

 SELECT pd.PhotoTitle, p.PhotoTN,p.PhotoCreatedOn, pd.AlbumID, ISNULL(p.PhotoID,NULL) AS Missing FROM AlbumPhotos p 
  JOIN AlbumPhotoDetails pd
  ON p.PhotoID = pd.PhotoID WHERE pd.AlbumID = 16 
  OR  p.PhotoID  IN (SELECT PhotoID FROM AlbumPhotoDetails WHERE LanguageID = 1 AND AlbumID = 16)

上面的查询让我得到基于PhotoID. 我迷失了如何实际达到预期的结果,如上面的示例“DESIRED OUT PUT”所示

4

1 回答 1

1

使用左外连接。

您显示的表格示例没有任何意义,因为没有字段可以连接它们,并且PDTitle示例数据中不存在您希望在结果中出现的值。

假设表中有一个PhotoId字段PhotoDetails(就像AlbumPhotoDetails您在显示的查询中使用的表中一样),并且该PhotoDetails表包含您希望在结果中出现的标题,您可以这样做:

select
  p.PhotoId, d.PDTitle, p.AlbumId,
  case when d.PhotoId is null then 'FALSE' else 'TRUE' end
from Photos p
left join PhotoDetails d on d.PhotoId = p.PhotoId
where p.AlbumId = 7

请注意,如果表中没有相应记录,则标题将为空PhotoDetails

于 2012-07-03T05:54:45.850 回答