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

从SQL Server中的联接结果中获取不同的行,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有两个表,一个用于存储Album\u Name,另一个用于存储Album\u照片 我想写一个查询,这样可以得到以下详细信息 Album_Name Album_ID Album_Date ImageSmall Album One 1 2013-08-02 100.jpg Album Two 2 2013-09-09 55.jpg 我需要来自album\u Name表的详细相册详细信息,以及我没

我有两个表,一个用于存储
Album\u Name
,另一个用于存储
Album\u照片

我想写一个查询,这样可以得到以下详细信息

Album_Name    Album_ID     Album_Date     ImageSmall
Album One     1            2013-08-02      100.jpg
Album Two     2            2013-09-09      55.jpg
我需要来自
album\u Name
表的详细相册详细信息,以及我没有从
album\u Photo
表分配到相册的第一张图像

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这不适用

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\u-Name
查看,它得到了与上述语句相同的行

SELECT 
    DISTINCT [Album_Name], Album_Date, Page_ID, Image_Small  
FROM 
    vw_AlbumName_AlbumPhotos 
WHERE 
    Page_ID = 3
样本数据
Album\u Name
Album\u照片
表格

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

非常感谢您的帮助。

由于每张相册都有多张照片,因此您将获得副本。要获得一个,请使用
行编号()


我假设您的相册表名为
Album
而不是
Album\u 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
)

此查询将更紧密地服务于您的目的,而不会太复杂

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
这是我能想到的最好的问题

原因:*这不使用任何子查询,如果可以,最好避免子查询 简单地做 *这不使用任何行号 *看起来不那么复杂 *这是我亲自测试过的,并且发现它是有效的

说明:GROUPBY返回不同的行。 注意:您的表包含的列名为imageSmall,因此如果需要,请进行相应更改 它看起来很小

请随时澄清


干杯

您要显示哪个照片记录-具有最小
图像\u ID的照片记录
?是的,图像\u ID,但我想选择always album图标作为为此相册创建的第一张照片错误
无法绑定多部分标识符“album\u Name.AlbumID”。
我的查询没有名为album\u Name的表(请参见我在代码上方的注释)甚至是一个名为AlbumID的列,所以这一定是您的错误。但是我看到在第一个列名之前有一个。您应该删除。@KnowledgeSeek…我看到了。我将其更改为
Image\u Id
。问题是如何定义“first”对于图像。第一张应该是我们添加到相册中的第一张照片。它可以工作并为我获取唯一记录。我尝试添加
WHERE
子句,该子句给了我一个错误。如何添加`WHERE a.PageID=3`例如,如果我只想获得与PageID页面相关的相册3@KnowledgeSeeker…您将添加
,其中a.PageID=3
on
子句之后(也删除分号)@Gordan,谢谢,我错过了生成错误的
。感谢您的帮助。如果有多个
相册照片
行,这将返回多行。不,它不会返回多行,我通过制作表格对此进行了测试,效果非常好。说明:按p分组。相册ID确保只返回一行。p请尝试一下。事实上,您是对的,不会有多行,因为它根本不起作用!如果您不为其他列使用聚合子句,则无法对一列进行分组。您将收到类似这样的错误“列‘whatever’在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。”那么您是否亲自测试过它,或者这只是为了让它听起来更具说服力而添加的内容