【问题标题】:Need help for SQL select query for this two table这两个表的 SQL 选择查询需要帮助
【发布时间】:2010-10-07 16:14:41
【问题描述】:

表格截图: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

谢谢大家,

【问题讨论】:

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


    【解决方案1】:

    应该这样做:

    编辑:原始代码是因为我认为您的日期是 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 - 很好的约会——我一开始也以为是 MM.DD.YYYY。假设它是一个字符串,就不能像现在这样在 UpdateDate 上做一个 MAX,这就是你所涵盖的。
    • 谢谢。我想给出一个完整的结果。
    • UpdateDate 类型:SmallDateTime
    • 根据您的反馈更新了我的答案。
    【解决方案2】:

    试试:

    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
    

    【讨论】:

    • 如果 Google 的日期是“12.11.2010”怎么办?
    • 我假设它是一个日期时间字段,并且不可靠的字符串格式是一个单独的问题。当然应该是 YYYYMMDD 才能完全安全。
    • 返回错误:无效的对象名称“位置”。我无法修复它
    • 因为我给你的表命名为Position和Content,如果你这么叫的话,你需要把它重命名为PositionTable。
    【解决方案3】:

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

    假设您的 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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 2016-09-13
      • 2011-04-03
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      相关资源
      最近更新 更多