2012-02-06 54 views
0
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。該鏈條繼續下降到爲該客戶創建的第一個記錄。從sql表中遞歸拉取值

我要的是我發出了一個命令,像

SELECT * FROM #customer其中id = 3

這應該放不僅ID = 3,但其所有的舊版本記錄,這也是記錄2和1。

SELECT * FROM #customer ID = 4

應僅拉出該記錄(OLDID = NULL)


增強(可選):如果有人發出commond

select * from #customer where id = 8

我想某種程度上想指出,這個客戶有一個新的記錄。我怎樣才能做到這一點?假設我將在ASP.NET應用程序中使用。

+0

看看[這](http://stackoverflow.com/questions/959804/simulation-of-connect-by-prior-of-oracle-in-sql-server) – StevieG 2012-02-06 19:50:55

+0

我嘗試過自己大概幾個小時。我知道你必須使用'Common Table Expression',但是目前爲止還沒有完成。 – 2012-02-06 19:53:38

回答

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 
+0

我也爲此+1了。如果可能,你可以給我一個提示,如何在子查詢中包含後面的記錄。 – 2012-02-06 20:08:45

+1

在我擁有的兩個查詢之間添加一個UNION ALL,它將返回所有舊記錄加上一個新記錄(如果存在)。 – Bort 2012-02-06 20:14:42

1

soething像這應該工作。(還沒有獲得一個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 
+0

我已經使其工作。它會按照選擇答案的相反方向提取記錄。我也可以用它來做一些事情。 – 2012-02-06 20:10:27

+0

您能否請解釋'從#客戶作爲nplus1,ñ 在哪裏n.id = nplus1.oldid'。 n指向什麼? nplus1指向我所知道的#customer表。 – 2012-02-24 14:44:19

+0

我想我明白了,但這對我來說是新的。 n將整個查詢引用爲'with n(...)'仍然我想知道這個語法 – 2012-02-24 14:50:03