从SQL Server中的JOIN结果中获取不同的行

问题描述 投票:2回答:3

我有两个表,我用来存储Album_Name和我用来存储Album_Photos的其他表

我想写一个查询,以便它可以让我了解详细信息

Album_Name    Album_ID     Album_Date     ImageSmall
Album One     1            2013-08-02      100.jpg
Album Two     2            2013-09-09      55.jpg

我想要从Album_Name表和第一张图片的详细资料专辑详情,我没有从Album_Photo表分配到相册

我试过JOINS哪个不起作用然后我创建一个视图将跟随SQL这不起作用

SELECT 
   a.Album_Name AS Album_Name
   , a.Album_Date AS Album_Date
   , a.Page_ID AS PageID
   , p.Image_ID AS Image_ID
   , p.Image_Small AS Image_Small 
FROM 
   Album_Name a
LEFT OUTER JOIN 
   Album_Photos p ON a.Album_ID = p.Album_ID

我尝试了DISTINCT Album_Name,因为它让我和上面的语句一样

SELECT 
    DISTINCT [Album_Name], Album_Date, Page_ID, Image_Small  
FROM 
    vw_AlbumName_AlbumPhotos 
WHERE 
    Page_ID = 3

样本数据Album_NameAlbum_Photos

Album_ID    Album_Name  Album_Date  Page_ID
1   Album One   2013-08-02      3
2   Album Two   2013-09-09      3
3   Album Three 2013-09-10      9

Image_ID    Page_ID Album_ID    ImageSmall
1       0       1   100.jpg
2       0       1   21.jpg
3       0       1   36.jpg
4       0       1   44.jpg
5       0       2   55.jpg
6       0       2   66.jpg
7       0       3   10.jpg

任何帮助表示赞赏。

sql sql-server sql-server-2008
3个回答
5
投票

您正在复制,因为每张专辑有多张照片。要获得一个,请使用row_number()

SELECT Album_Name AS Album_Name, a.Album_Date AS Album_Date, a.Page_ID AS PageID,
       p.Image_ID AS Image_ID, p.Image_Small AS Image_Small 
FROM Album_Name a left outer JOIN
     (select p.*, row_number() over (partition by Album_Id order by Image_ID) as seqnum
      from Album_Photos p 
     ) p
    ON a.Album_ID = p.Album_ID and seqnum = 1;

1
投票

我假设您的相册表名为Album而不是Album_Name

SELECT .Album_Name AS Album_Name
, a.Album_Date AS Album_Date
, a.Page_ID AS PageID
, p.Image_ID AS Image_ID
, p.Image_Small AS Image_Small 
FROM Album a left outer JOIN Album_Photos p 
ON a.Album_ID = p.Album_ID
WHERE p.Image_ID = (
    SELECT MIN(Image_ID)
    FROM Album_Photos
    WHERE Album_Photos.Album_ID = Album.Album_ID
)

1
投票

此查询可以更紧密地满足您的目的,而不会有太多复杂

SELECT Album_Name AS Album_Name, a.Album_Date AS Album_Date, 
       p.Image_ID AS Image_ID, p.Image_Small AS Image_Small 
FROM Album_Name a left outer JOIN
Album_Photos p
    ON a.Album_ID = p.Album_ID group by p.Album_ID

这是我能想到的最好的查询。

原因:*这不使用任何子查询,它更好地避免子查询,如果你可以简单地做*这不使用任何row_number *看起来不那么复杂*这个我亲自测试,发现它工作。

说明:Group by返回不同的行。注意:您的表包含列名称为imageSmall,因此如果您希望它是image_small,则相应地更改。

请随意澄清。

干杯!!!

© www.soinside.com 2019 - 2024. All rights reserved.