在单表链中查找最后一条记录(SQL Server)
技术问答
267 人阅读
|
0 人回复
|
2023-09-14
|
在SQL Server 2005中获得了此表,该表用于维护合并操作的历史记录:
4 h+ u; e- a1 C! }列FROM_ID(int)* ~/ M) r) \! p9 D! O$ K+ Z
列TO_ID(int)+ }% G. j% ]! }0 o+ K; |0 w
* j/ h, y/ T% B% @1 h
现在,我需要一个将原始FROM_ID作为输入并返回最后一个可用TO_ID的查询。1 L" u8 m8 }/ j' Y2 [9 `
因此,例如:- C5 x$ ] i- Z+ k
ID 1合并到ID 22 z) B$ M* W2 b: a4 E+ W5 `$ _% m
以后,ID 2合并为ID 3
+ [# }- W$ f h6 C( Q稍后再次将ID 3合并为ID 4
! X3 N/ G5 l! U7 M# \- R, A4 ` j; f( Y3 J V/ `# g
因此,我要汇总的查询将作为输入(在我认为的WHERE子句中)ID 1,因此,在这种情况下,应给我最后一个可用的TO_ID。
& d( X+ @; x6 _我想我需要一些递归逻辑,但是真的不知道如何开始。$ ^, X2 y% m5 F+ @4 a z
谢谢 !/ _) T1 L& X( B, s8 p
马修7 H5 @& E* q, v
2 C Y; V. H/ Q: _( r# L1 v解决方案:
2 o' G$ ?4 j" d' b7 Q9 u
) V4 X' W2 t2 z7 _$ Q i
" B6 M. A# k; H
5 [! M* Q# X! R4 W% {, s! C 使用CTE是可行的。8 p- H! O* W2 M0 J3 y8 T
测试脚本! c/ _' L. |7 J3 }3 Y
DECLARE @IDs TABLE ($ w n' T3 N3 k" R( X3 @1 x: Z
FromID INTEGER
, d$ ^( c. K; A , ToID INTEGER* c1 p2 L4 D' N4 Y7 v! Q
)' q9 {: F' x) m. P
INSERT INTO @IDs* Q1 q$ l" y3 L6 P) S% w
SELECT 1, 2
c4 ^- ]0 N3 r- u1 O6 ?, L+ YUNION ALL SELECT 2, 39 f8 v* s7 }+ m; u- J' i4 T
UNION ALL SELECT 3, 4! @3 C: O5 t! S8 X1 r
SQL语句
3 |4 U( @1 E* H;WITH q AS (
# G" l; W$ M* ]1 ~/ C2 d SELECT FromID, ToID4 z6 H$ j* C$ L; H
FROM @IDs
- z8 s% b, [: \ n5 f" G UNION ALL / U( n9 K. w# ]& y6 G
SELECT q.FromID, u.ToID
4 F1 Z+ U4 t2 g4 d" g6 @& W, a) j FROM q
) v& D$ n! ?* C7 j INNER JOIN @IDs u ON u.FromID = q.ToID8 G" \7 N0 W c* y% k5 D* Q
)
0 _* z5 d, o2 _9 P9 \0 y: P" r& C. WSELECT FromID, MAX(ToID)& n6 W* w3 B- {
FROM q
' b( X f! O& W7 d) F! x& KWHERE FromID = 1
# @/ i4 }# e( Q/ G) F6 ]GROUP BY
, t" ^2 _! }+ b, h1 n4 I1 Y2 O+ y FromID |
|
|
|
|
|