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

时间:2013-09-10 11:32:38

标签: sql sql-server sql-server-2008

我有两个表用于存储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_Name& Album_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

感谢任何帮助。

3 个答案:

答案 0 :(得分: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 :(得分: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
)

答案 2 :(得分: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。

请随意澄清。

干杯!!!