我在编写SQL查询时遇到了麻烦

时间:2012-08-24 17:01:00

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

我有两张桌子:媒体和画廊。媒体包含数千种不同类型病毒媒体的记录,如视频,图片,游戏等......图库包含与媒体表中图片记录组相关联的图库ID列表。

My Tables

目前,我有一个查询,它将从Gallery表中返回Gallery记录列表,并将MediaThumb与Media表中相应的GalleryIds组相关联。这是查询:

SELECT a.GalleryID, a.GalleryTitle, a.GalleryDate, MAX(b.MediaThumb) AS MediaThumb
FROM Galleries a
INNER JOIN Media b
ON a.GalleryID = b.GalleryID
GROUP BY a.GalleryID, a.GalleryTitle, a.GalleryDate
order by a.GalleryID desc

我现在想要的是一个查询,它返回图库记录列表以及媒体表中MediaTypeID = 1或2或3的所有记录。

我不太擅长复杂的SQL,可以使用某种方向/帮助。我甚至不确定我想要的是不可能的。我需要上面的上述查询与Media表中的记录交织在一起。希望你们中的一些SQL大师可以伸出援助之手!

THX!

2 个答案:

答案 0 :(得分:4)

如果您想要图库和最大缩略图以及相关的媒体行,请使用此选项:

; WITH CTE AS (
SELECT a.GalleryID GalleryID_A, a.GalleryTitle, a.GalleryDate, b.*,  
ROW_NUMBER() OVER (PARTITION BY  a.GalleryID, a.GalleryTitle, a.GalleryDate 
                    ORDER BY b.MediaThumb DESC) AS Rn
FROM Galleries a
INNER JOIN Media b
ON a.GalleryID = b.GalleryID
Where b.MediaTypeID in (1,2,3)
)
SELECT * FROM CTE where Rn = 1

以上查询的示例数据和结果 - http://sqlfiddle.com/#!3/09e4f/1

根据我们在聊天中的讨论更新了查询:

WITH CTE AS (
SELECT a.GalleryID GalleryID_A, a.GalleryTitle, a.GalleryDate, b.*,  
ROW_NUMBER() OVER (PARTITION BY  a.GalleryID, a.GalleryTitle, a.GalleryDate 
                    ORDER BY b.MediaThumb DESC) AS Rn
FROM Media b
INNER JOIN Gallery A
ON a.GalleryID = b.GalleryID
), 
CTE2 AS
(
SELECT a.GalleryID GalleryID_A, a.GalleryTitle, a.GalleryDate, b.*,  
1 Rn
FROM Media b
LEFT OUTER JOIN Gallery A
ON a.GalleryID = b.GalleryID
)
SELECT * FROm CTE where rn = 1
UNION ALL
SELECT * FROM CTE2 WHERE rn = 1 and galleryid is null
order by mediaid

上面的小提琴 - http://sqlfiddle.com/#!3/72935/12

答案 1 :(得分:0)

你需要使用连接而不分组...左外连接将确保所有的画廊被拾取...即。没有任何相应媒体的薪水也会被提起。

SELECT a.*, b.*
FROM Galleries a
Left outer JOIN Media b ON a.GalleryID = b.GalleryID
Where b.MediaTypeID in (1,2,3)