Sql 基于来自另一个表的链接结果的where子句的查询
我的数据库中有3个表。表A包含项目的主ID和标题。表B是该项目的主要详细信息表,我们记录了对其进行的每次更新的新记录。表C是可以添加到项目中的分部,每个记录可以有多个分部 表ASql 基于来自另一个表的链接结果的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
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的记录,它只会显示单个最新记录。我用更多的细节更新了我的问题。