SELF参考SQL查询

时间:2014-12-12 23:24:57

标签: sql-server tsql

我的MS SQL数据库中有一个名为PolicyTransactions的表。该表有两个重要的列:

trans_id  INT IDENTITY(1,1),
policy_id INT NOT NULL,

我需要帮助编写一个查询,该查询将为表中的每个trans_id / policy_id将其连接到该policy_id的最后一个trans_id。这似乎是一个简单的查询,但由于某种原因,我现在无法在脑中得到凝胶。

谢谢!

2 个答案:

答案 0 :(得分:2)

我为你做了这个......希望你正在寻找它:http://sqlfiddle.com/#!6/e7dc39/8

基本上,cross applysubquery或常规join不同。它是一个查询,它根据查询外部返回的每一行执行。这就是为什么它可以看到外部表(子查询不具备这种能力),这就是为什么它使用旧学校连接语法(旧学校意味着 _ = _ join条件strong>在where子句中。

对这个解决方案非常小心,因为交叉应用并不是地球上最快的事情。但是,如果表上的索引是正确的,那么这个微小的查询应该会很快运行。

这是我能想到解决它的唯一方法,但它并不意味着唯一的方法!

只是一个超级快速编辑:如果您注意到,某些行不会返回,因为它们是FIRST策略,因此不会使用相同策略编号的tran_id小于它们。如果您想使用应用模拟outer join,请使用outer apply :)

答案 1 :(得分:2)

如果您使用的是SQL Server 2012或更高版本,则应使用LAG()功能。请参阅下面的代码段,我觉得它比这里给出的其他答案更清晰。

SELECT trans_id, policy_id, LAG(trans_id) OVER (PARTITION BY policy_id ORDER BY trans_id)
FROM PolicyTransaction