2013-04-26 24 views
0

我有一张照片子表,所以一个职位可以有很多照片,其中一个照片表列是[优先]。SQL Server +选择与子表项目记录

,我需要选择从岗位表中的记录,只有有另一个表中的最高优先级的照片:

所以结果应该是这样的:

Photo Post 
pic1 Article1 
picX Article2 

目前我的结果显示为

Photo Post 
pic1 Article1 
pic2 Article1 
picX Article2 

与此查询:

SELECT [Photo], 
     [PostTitle] 
FROM [Post] sp 
INNER JOIN [PostPhotos] spp 
ON (sp.AutoId = spp.PostId) 
WHERE sp.[AutoId] IN (SELECT [PostID] 
         FROM [Favorites] 
         WHERE [UserId] = 'UserXXX') 

我尝试没有成功连接查询:

SELECT photo, 
     [PostTitle], 
     [AskingPrice] 
FROM (SELECT sp.[AutoId], 
       [PostTitle] 
     FROM [SellPost] sp 
     WHERE sp.[AutoId] IN (SELECT [PostID] 
          FROM [Favorites] 
          WHERE [UserId] = 'UserId'))a 
full OUTER JOIN(SELECT TOP 1 [PostId], 
         [photo] 
       FROM [PostPhotos] spp 
       WHERE PostId IN (SELECT [PostID] 
            FROM [Favorites] 
            WHERE [UserId] = 'UserXXX') 
       ORDER BY [Priority] ASC)b 
    on (a.AutoId = b.PostId) 
    order by a.AutoId; 

我的表:

Table Post 
PostId, PostTitle 

Table PostPhotos 
AutoId, PostId, Photo, Priority --> 1 post can have many photos 

有人可以请您帮助。谢谢。

回答

0

对不起,在我的帖子中的错误,我想我一直在想太深,我需要的是:

SELECT [p].[AutoId], [PostTitle], [Photo] FROM [Post] p 
     INNER JOIN [PostPhotos] pp 
     ON [p].[AutoId] = [pp].[PostId] 
     WHERE p.[AutoId] IN (SELECT [PostID] FROM [Favorites] WHERE [UserId] = @UserId) 
     AND [Priority] = 1 
0

尝试用这个提示:

SELECT [p].[PostId],[PostTitle],[Photo] FROM [Post] p 
INNER JOIN [PostPhots] pp 
ON [p].[PostId] = [pp].[PostId] 
WHERE [p].[PostId] 
IN (SELECT TOP 1 [PostId] FROM [PostPhotos] ORDER BY [Priority] DESC) 
0

有几件事情都不清楚从你的描述(如什么是AutoId,什么是PostPhotos主键,你有什么用Favorites做的/那有什么查表喜欢)。但这里的总体思路是:

WITH RankedPhotos AS (
    SELECT 
    PostId, 
    AutoId, -- I'm assuming this is the primary key of PostPhotos? 
    RANK() OVER (PARTITION BY AutoId, PostId ORDER BY Priority ASC) AS PhotoRank 
    FROM 
    Post p JOIN 
    PostPhotos pp ON 
     p.PostId = pp.PostId 
), TopPhotos AS (
    SELECT 
    PostId, 
    AutoId 
    FROM 
    RankedPhotos 
    WHERE 
    PhotoRank = 1 
) 
SELECT 
    PostTitle, 
    Photo 
FROM 
    RankedPhotos r JOIN 
    Post p ON 
    r.PostId = p.PostId JOIN 
    PostPhotos pp ON 
    r.AutoId = p.AutoId 

当然你可以解开的CTE和使用嵌套子查询(你也很可能摆脱TopPhotos完全),但是这可能是更容易看到/明白了。

的基本思路是:

  • RankedPhotos,“等级”的所有Post /PostPhoto
  • 的在TopPhotos过滤器的ID下降到最高等级的那些
  • 加入回原始表格来获取您实际需要的记录

显然,如果您需要按其他条件过滤(如用户)需要添加。最好尽可能在过程中尽早添加(即在RankedPhotos中),否则数据库可能最终需要做更多的工作。

0

子查询不是我的最强点,但我认为以下可能工作:

SELECT t1.Photo, t2.PostTitle 
FROM Post t2 
    INNER JOIN PostPhotos t1 ON (t2.PostID = t1.PostID) 
WHERE t1.AutoID IN (SELECT TOP 1 d.AutoID, d.PostID 
         FROM PostPhotos As d 
         WHERE d.PostID = t1.PostID 
         ORDER BY d.Priority, d.AutoID) 

注意在子查询的顺序加入d.AutoID的,这是情况下,两个照片具有相同的优先级。

编辑我学到了很多的东西我知道子查询here

0
SELECT B.Photo,A.[PostTitle] 
FROM [Post] A INNER JOIN 
     (SELECT AutoId,PostId,Photo,Priority 
     FROM PostPhotos 
     WHERE Priority =1) B ON A.[PostId] = B.[PostId] 

我会这样做, 和内连接和左连接都可以得到你想要的结果。