Sql 基于来自另一个表的链接结果的where子句的查询

Sql 基于来自另一个表的链接结果的where子句的查询,sql,sql-server,tsql,where-clause,greatest-n-per-group,Sql,Sql Server,Tsql,Where Clause,Greatest N Per Group,我的数据库中有3个表。表A包含项目的主ID和标题。表B是该项目的主要详细信息表,我们记录了对其进行的每次更新的新记录。表C是可以添加到项目中的分部,每个记录可以有多个分部 表A TAID | Name ------------- 1 | Test 1 2 | Test 2 3 | Test 3 TAID | Name ------------- 2 | Test 2 表B TANo | TAID | Description | C

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

表A

TAID | Name
-------------
1   |  Test 1  
2   |  Test 2  
3   |  Test 3  
TAID | Name
-------------
2   |  Test 2  
表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
TANo   |   TAID   |   Description   |  Completed
------------------------------------------------
4      |   2      |   Other text    |  False
5      |   2      |   Test 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
DivID   |   TANo   |   TAID   |   DivisionID
------------------------------------------------
3      |   4      |    2      |   2
4      |   5      |    2      |   2
5      |   5      |    2      |   4
我想要做的是写一个查询,它可以让我提取出一个ID的最新记录,但要按部门进行细分。我的查询只是从表B到表A中获取最新的一行,但我一直在思考如何根据我想要获取第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
-------------
1   |  Test 1  
2   |  Test 2  
3   |  Test 3  
TAID | Name
-------------
2   |  Test 2  
表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
TANo   |   TAID   |   Description   |  Completed
------------------------------------------------
4      |   2      |   Other text    |  False
5      |   2      |   Test 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
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

如果要在
表B
中为每个分区创建最新记录,可以加入并使用窗口功能进行筛选:

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
当然,你也可以把
表格a
带进来:

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

注意:不清楚为什么要在
表B
表C
中存储
taid
;就问题而言,
tableb
中的记录属于单个项目,因此显然不需要在
tablec
中存储冗余信息,谢谢您的回复。公平地说,我可以从表C中删除TAID,因为我可以使用TANO作为我的加入。这个查询几乎成功了,但它似乎并没有带来一切?此外,它还显示对TableB进行的所有更新的记录,如果一个记录有多个分区,则显示额外的记录。我想说的是,例如TableB可能有多个更新(意味着多个部门更新),我只想说搜索部门ID 1和2的记录,它只会显示单个最新记录。我用更多的细节更新了我的问题。