いずれかの列から関連するすべてのエイリアス ID を返すクエリが必要です。ここに示されているのは、他の何千もの行の中からいくつかのエイリアスの顧客 ID です。クエリへの入力パラメータが id=7 の場合、5 行 (1,5,7,10,22) を返すクエリが必要です。これは、それらがすべて互いの別名であるためです。たとえば、22 と 10 は 7 の間接エイリアスです。
CustomerAlias
--------------------------
AliasCuID AliasCuID2
--------------------------
1 5
1 7
5 7
10 5
22 1
以下は顧客テーブルからの抜粋です。
Customer
----------------------------------
CuID CuFirstName CuLastName
----------------------------------
1 Mike Jones
2 Fred Smith
3 Jack Jackson
4 Emily Simpson
5 Mike Jones
6 Beth Smith
7 Mike jones
8 Jason Robard
9 Emilie Jiklonmie
10 Michael jones
11 Mark Lansby
12 Scotty Slash
13 Emilie Jiklonmy
22 mike jones
近づくことはできましたが、間接的に関連するエイリアスを正しく選択できないようです。このクエリを考えると:
SELECT DISTINCT Customer.CuID, Customer.CuFirstName, Customer.CuLastName
FROM Customer WHERE
(Customer.CuID = 7) OR (Customer.CuID IN
(SELECT AliasCuID2
FROM CustomerAlias AS CustomerAlias_2
WHERE (AliasCuID = 7))) OR (Customer.CuID IN
(SELECT AliasCuID
FROM CustomerAlias AS CustomerAlias_1
WHERE (AliasCuID2 = 7)))
もちろん、目的の ID の 5 つのうち 3 つを返します。これにより、間接的に関連付けられた 10 と 22 のエイリアス ID が結果行にありません。
1 Mike Jones
5 Mike Jones
7 Mike jones
*以下の提案に基づいて、CTE 階層クエリを試しています。
いくつかの提案に従った後、私は今これを持っています。テーブル内のレコードが十分な即時 ID を参照している限り、これは機能します。ただし、クエリで id=10 を使用すると、データの性質上、まだ不十分です。
DECLARE @id INT
SET @id = 10;
DECLARE @tmp TABLE ( a1 INT, a2 INT, Lev INT );
WITH Results (AliasCuID, AliasCuID2, [Level]) AS (
SELECT AliasCuID,
AliasCuID2,
0 as [Level]
FROM CustomerAlias
WHERE AliasCuID = @id OR AliasCuID2 = @id
UNION ALL
-- Recursive step
SELECT a.AliasCuID,
a.AliasCuID2,
r.[Level] + 1 AS [Level]
FROM CustomerAlias a
INNER JOIN Results r ON a.AliasCuID = r.AliasCuID2 )
INSERT INTO @tmp
SELECT * FROM Results;
WITH Results3 (AliasCuID, AliasCuID2, [Level]) AS (
SELECT AliasCuID,
AliasCuID2,
0 as [Level]
FROM CustomerAlias
WHERE AliasCuID = @id OR AliasCuID2 = @id
UNION ALL
-- Recursive step
SELECT a.AliasCuID,
a.AliasCuID2,
r.[Level] + 1 AS [Level]
FROM CustomerAlias a
INNER JOIN Results3 r ON a.AliasCuID2 = r.AliasCuID )
INSERT INTO @tmp
SELECT * FROM Results3;
SELECT DISTINCT a1 AS id FROM @tmp
UNION ALL
SELECT DISTINCT a2 AS id FROM @tmp
ORDER BY id
これは、関連する ID のリストを提供する単純化されたクエリであることに注意してください。
---
id
---
5
5
7
10
ただし、ID 1 と 22 を取得することはまだできません。