从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子句中。”那么您是否亲自测试过它,或者这只是为了让它听起来更具说服力而添加的内容