2012-02-26 10 views
5

SQL Serverのデータベースでこのようなことが可能であるかどうかわかりませんか?T-SQLデータベースで再帰的なSELECTを行うことができます

言って、私はテーブルを持っている:

id INT 
nm NVARCHAR(256) 
cid INT --references [id] 

と仮想的なデータ:

id nm  cid 
1 Name 1 0 
2 Name 2 0 
3 Name 3 1 
4 Name 4 3 
5 Name 5 2 
6 Name 6 4 
7 Name 7 2 

、次のように選択のためのロジックは、次のようになります。

  1. 我々が持っていると言います、元のid、それをNとしましょう。

  2. その後、我々はのは、その後、我々が行うX.それを呼びましょう、ルックアップIDを持っている:

    SELECT [cid] FROM [TableName] WHERE [id]=X 
    

とはい、我々はそのレコードの[NM]を返す場合、結果がNに等しいかどうかを確認。結果が0の場合、Nullを返します。結果が他のものであれば、Xが結果値になる以外は同じ選択を行います。

私は明らかにC#でこれを行うことができますが、純粋なSQL文でそのようなことができるかどうか不思議です。

PS。

SELECT [cid] FROM [TableName] WHERE [id]=6 --results is 4 (not N or 0, then continue) 
SELECT [cid] FROM [TableName] WHERE [id]=4 --results is 3 (not N or 0, then continue) 
SELECT [cid] FROM [TableName] WHERE [id]=3 --results is 1 (is N, then return "Name 1") 

またはNが1であり、Xが7であれば、我々が得る:

SELECT [cid] FROM [TableName] WHERE [id]=7 --results is 2 (not N or 0, then continue) 
SELECT [cid] FROM [TableName] WHERE [id]=2 --results is 0 (is 0, then return Null) 

ただ、Nは1であり、Xが6であれば、我々が得る、上記の私のテーブルでこれを説明するために、編集: これは、SQL Server 2008で実行する必要があります。

+0

DBMSとは何ですか? SQL Server、Oracleなど –

+1

どのバージョンのSQL Serverですか?これは再帰的なCTE(一般的なテーブル式)で可能ですが、あなたのバージョンで利用可能かどうかわかりません。 – hvd

+0

@hvd SQL Server 2008を使用しています – ahmd0

答えて

14

再帰的なCTEがこれを行うことができます。それは次のようになります。

WITH q AS (
    SELECT t.id, t.name, t.cid 
    FROM t 
    WHERE t.id = @x 
    UNION ALL 
    SELECT t.id, t.name, t.cid 
    FROM q 
    INNER JOIN t 
    ON t.id = q.cid 
) 
SELECT name 
FROM q 
WHERE id = @n 

アイデアは、CTEが01​​句の第二部では、それ自体を参照することができ、そしてそれはこれ以上の結果を生成するまで、第2の部分を評価することである、または内部制限が達成された。

+0

非常にいいです。私はそれを試す必要があります。ありがとう。 – ahmd0

関連する問題