回答

收藏

在单表链中查找最后一条记录(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
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则