【问题标题】:Query based on where clause of linked results from another table根据另一个表的链接结果的where子句查询
【发布时间】:2020-03-11 18:02:06
【问题描述】:

我的数据库中有 3 个表。表 A 包含项目的主要 ID 和标题。表 B 是项目的主要详细信息表,我们为对其进行的每次更新记录一条新记录。表 C 是可以添加到项目中的部门,每条记录可以有多个。

表 A

TAID | Name
-------------
1   |  Test 1  
2   |  Test 2  
3   |  Test 3  

表 B

TANo   |   TAID   |   Description   |  Completed
------------------------------------------------
1      |   1      |   Some text     |  True
2      |   1      |   More text     |  True
3      |   1      |   Extra text    |  False
4      |   2      |   Other text    |  True
5      |   2      |   Test text     |  True
6      |   3      |   Text          |  True

表 C

DivID   |   TANo   |   TAID   |   DivisionID
------------------------------------------------
1      |   1      |    1      |   1
2      |   1      |    1      |   2
3      |   2      |    1      |   2
4      |   3      |    1      |   2
5      |   6      |    3      |   4

我想要写一个查询,它可以让我提取一个 ID 的最新记录,但按部门细分。我的查询只是从表 B 到表 A 中获取最新的行,但我不知道如何根据我想获得 Division 1 的所有结果来查询我的结果?还是多个部门?

 Select 
 ta.Name
,tb.TANo
,tb.TAID
,tb.Description
,tb.Completed
From
TableA ta

CROSS APPLY
(
    Select
    Top(1)
     b.TANo
    ,b.TAID
    ,b.Description
    ,b.Completed
    From
    TableB as b
    Where
    b.TAID = ta.TAID 
    Order by b.TANo desc
) as tb

因此,作为一个示例,我可以拥有已对其进行多次更新的这条记录:

表 A

TAID | Name
-------------
2   |  Test 2  

表 B

TANo   |   TAID   |   Description   |  Completed
------------------------------------------------
4      |   2      |   Other text    |  False
5      |   2      |   Test text     |  True

表 C

DivID   |   TANo   |   TAID   |   DivisionID
------------------------------------------------
3      |   4      |    2      |   2
4      |   5      |    2      |   2
5      |   5      |    2      |   4

然后,如果我搜索第 2 和第 4 分区中的记录,则在上面的查询中添加一些内容,我可以拉回仅显示项目最新单条记录的结果

结果

TAID   |   TANo   |   Description   |   Completed
------------------------------------------------
2      |   5      |    Test text    |   True

【问题讨论】:

    标签: sql sql-server tsql where-clause greatest-n-per-group


    【解决方案1】:

    如果你想要tableb中每个部门的最新记录,你可以加入并使用窗口函数进行过滤:

    select *
    from (
        select 
            c.divisionId, 
            b.description, 
            b.completed, 
            row_number() over(partition by c.divisionId order by tano desc) rn
        from tablec c
        inner join tableb b on b.tano = c.tano
    ) t
    where rn = 1
    

    当然你也可以带入tablea:

    select *
    from (
        select 
            c.divisionId, 
            b.description, 
            b.completed, 
            a.name
            row_number() over(partition by c.divisionId order by tano desc) rn
        from tablec c
        inner join tableb b on b.tano = c.tano
        inner join tablea a on a.taid = b.taid
    ) t
    where rn = 1
    

    注意:目前尚不清楚您为什么将taid 存储在tableb 和tablec 中;就关注点而言,tableb 中的记录属于单个项目,因此显然不需要在tablec 中存储冗余信息。

    【讨论】:

    • 感谢您的回复。公平点我可以从 TableC 中删除 TAID,因为我可以只使用 TANO 作为我的加入。这个查询几乎已经奏效,但它似乎并没有带回一切?此外,它还显示对 TableB 所做的所有更新的记录,如果对记录有多个划分,则显示额外记录。我要说的是,例如 TableB 可能有多个更新(意味着多个部门更新)我只想能够说搜索部门 ID 1 和 2 的记录,它只会显示单个最新记录。我已经用更多细节更新了我的问题。
    猜你喜欢
    • 2012-11-26
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2017-05-20
    相关资源
    最近更新 更多