【问题标题】:pull values recursively from sql table从 sql 表中递归提取值
【发布时间】:2012-02-06 19:30:04
【问题描述】:
create table #customer (
id int not null primary key,
cust_name varchar(12),
oldid int null
)

insert into #customer values(1,'XYZ',null) 
insert into #customer values(2,'XYZ',1) 
insert into #customer values(3,'XYZ',2) 
insert into #customer values(4,'ABC',null) 
insert into #customer values(5,'ABC',4) 
insert into #customer values(6,'DEF',null) 
insert into #customer values(7,'DEF',6) 
insert into #customer values(8,'DEF',7) 
insert into #customer values(9,'DEF',8) 


select * from #customer
-- output

id          cust_name    oldid
----------- ------------ -----------
1           XYZ          NULL
2           XYZ          1
3           XYZ          2
4           ABC          NULL
5           ABC          4
6           DEF          NULL
7           DEF          6
8           DEF          7
9           DEF          8

这是更新记录时的模拟,新记录存储其旧记录的ID。这条链继续下去,一直到为该客户创建的第一条记录。

我想要的是我发出类似的命令

select * from #customer where id=3

这不仅应该放 id=3 的记录,还应该放它的所有旧版本,也就是记录 2 和 1。

从 #customer id=4 中选择 *

应该只提取那条记录(oldid = null)


增强(可选):如果有人发布了一个command

select * from #customer where id=8

我想以某种方式表明,该客户存在一条新记录。我怎样才能做到这一点?假设我要在 ASP.NET 应用程序中使用。

【问题讨论】:

  • 看看this
  • 我自己试了几个小时。我知道你必须使用Common Table Expression,但到目前为止还不能正确使用。

标签: sql sql-server-2005 common-table-expression


【解决方案1】:

可以使用CTE 获取给定客户的所有旧记录。类似的东西

DECLARE @CustomerId int
SET @CustomerId = 8

;
WITH Records (Id, Cust_name, OldId) AS (
    SELECT * FROM #Customer
    WHERE Id = @CustomerId
    UNION ALL
    SELECT C.* FROM Records R
        INNER JOIN #Customer C on C.Id = R.OldId)
SELECT * FROM Records

您可以选择指示是否存在较新的记录,您可能希望在结果集中包含较新的记录或只是一个位标志,但无论如何查询都会像

SELECT * FROM #Customer WHERE OldId = @CustomerId

【讨论】:

  • 我也为此 +1 了。你能给我一个提示吗,如果可能的话,如何在子查询中包含后面的记录。
  • 在我拥有的两个查询之间添加一个 UNION ALL,这将返回所有旧记录加上一个新记录(如果存在)。
【解决方案2】:

这样的事情应该可以工作..(目前无权访问 SQLServer 会话进行测试..)

WITH n(id, cust_name) AS 
   (SELECT id, cust_name 
    FROM customer
    WHERE id = @id
        UNION ALL
    SELECT nplus1.id, nplus1.cust_name 
    FROM emp as nplus1, n
    WHERE n.empid = nplus1.oldid)
SELECT * FROM n

【讨论】:

  • 我已经成功了。它以与选择答案相反的方向拉记录。我也可以用它来做点什么。
  • 你能解释一下FROM #customer as nplus1, n WHERE n.id = nplus1.oldid。 n 指的是什么? nplus1 指向我知道的#customer 表。
  • 我想我明白了,但这对我来说是新的。 n 将整个查询称为 with n(...) 仍然我想知道这个语法
猜你喜欢
  • 2015-03-24
  • 2021-03-31
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多