需要帮助SQL select查询这两个表

时间:2010-10-07 16:14:42

标签: sql-server sql-server-2005 tsql subquery

表捕获图像:http://img844.imageshack.us/img844/6213/99730337.jpg

------------ PositionTable------------
ID    ContentFK   Position
11     100               1
12     101               1
13     104               2
14     102               2
15     103               2
16     105               3
17     106               3
18     107               2


----------Content Table ------------
ContentID   UpdateDate  Title
100          11.10.2009    Aol
101          12.10.2009    Microsoft
102          12.10.2009    e-Bay
103          12.11.2009    google
104          16.11.2009    novell
105          17.11.2009    asus
106          16.11.2009    nokia
107          11.11.2009    samsung

谁能帮助我解决两个表之间的问题 我的情景。

按编号排序为位置1,2,3。但是,许多组只列出一条记录 (按职位ASC排序(职位:1,2,3)

使用PositionTable.ContentFK = ContentTable.ContentID 通过ContentTablo上次更新的UpdateDate

我如何获得与结果相同的列表。

p.Postion     p.ID            p.ContentFK     c.UpdateDate      c.Title

1             12              101             12.10.2009        Microsoft 
2             13              104             16.11.2009        novell 
3             16              105             17.11.2009        asus

全心全意,

3 个答案:

答案 0 :(得分:2)

这应该这样做:

编辑:原始代码是因为我认为您的日期是MM.DD.YYYY。已实现您的日期为DD.MM.YYYY并相应调整了代码。

编辑2 :根据UpdateDate数据类型的反馈更改了答案。

;with cteMaxDate as (
    select p.Position, MAX(c.UpdateDate) as MaxDate
        from PositionTable p
            inner join ContentTable c
                on p.ContentFK = c.ContentID
        group by p.Position
)
select p.Position, p.ID, p.ContentFK, c.UpdateDate, c.Title
    from cteMaxDate m
        inner join PositionTable p
            on m.Position = p.Position
        inner join ContentTable c
            on p.ContentFK = c.ContentID
                and m.MaxDate = c.UpdateDate

答案 1 :(得分:0)

子查询有点难看(并且相关),但这是我能想到的最简单的方法。

假设您的UpdateDate列是DATETIME - 否则您将不得不像Joe那样做(或者,更好的是,将列更改为DATETIME: - )

select p.Position
    ,p.ID
    ,p.ContentFK
    ,c.UpdateDate
    ,c.Title
from PositionTable p
join ContentTable c
    on p.ContentFK = c.ContentID
    and c.UpdateDate = (select max(ic.UpdateDate) from ContentTable ic
                            join PositionTable ip
                                on ip.ContentFK = ic.ContentID
                            where ip.Position = p.Position)
order by p.Position 

答案 2 :(得分:0)

尝试:

select Position,  ID, ContentFK, UpdateDate, Title
from (
select  p.Position,
    p.ID,
    p.ContentFK,
    c.UpdateDate,
    c.Title,
    row_number() over (partition by p.Position order by p.Position, c.UpdateDate desc) as num
from    Position p inner join
    Content c on p.ContentFK = c.ContentId ) a
where   num = 1