2012-02-06 7 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テーブルから値を再帰的に引き出す

これは、ID = 3のレコードが、そのすべての古いバージョンではないだけを置くべきで、ID = 3

#customer SELECT * FROMように私は、コマンドを発行しています、つまりレコード2と1もあります。 #customer IDから

選択* = 4

は、そのレコードだけを引く必要があります(oldid = null)の


強化(オプション):誰かがcommondを発行する場合

select * from #customer id = 8

私はどういうわけか、この顧客に新しいレコードが存在することを示したいと思います。どうやってやるの?私はASP.NETアプリケーションで使用するつもりであると仮定します。

+0

は、私はそれを自分自身を試してみました[この](http://stackoverflow.com/questions/959804/simulation-of-connect-by-prior-of-oracle-in-sql-server) – StevieG

+0

を見て2〜3時間。私はあなたが '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 
+0

これも+1しました。可能であれば、サブクエリーにも後のレコードを含める方法を教えてください。 –

+1

2つのクエリの間にUNION ALLを追加すると、すべての古いレコードと新しいレコードが存在する場合は新しいレコードが返されます。 – Bort

1
この(テストするために、現時点でのSQLServerセッションへのアクセス権を持っていない...)..動作するはずのような

soething

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

私はそれを作った。それは、選択回答と反対の方向にレコードを引っ張ります。私は何かのためにそれを使うかもしれません。 –

+0

あなたは 'FROM#customer nplus1、n WHERE n.id = nplus1.oldid'と説明できますか? nは何を指していますか? nplus1は、私が知っている#customerテーブルを指しています。 –

+0

私はそれを持っていると思うが、これは私には新しいものです。 nはクエリ全体を 'with n(...)'と呼びますが、この構文について知りたいのですが –

関連する問題