联合

2016-10-22 43 views
0

我有2个表联合

1. parent table and 2. Child Table 

父表值

Pid parent_name 
1 A 
2 B 
3 D 
4 H 
5 J 

子表值

Chid Pid child_name 
1  1 B 
2  1 C 
3  1 D 
4  2 F 
5  2 G 
6  3 H 
7  3 I 
8  4 J 
9  4 K 
10 5 L 

当我送你输入一个的话,我将获得输出为

Pid 
B 
D 
H 
J 

当我送你输入d,然后我会得到输出

Pid 
H 
J 

是像树结构的时候我给家长,然后名称结果将是所有的孩子,孙子,大的孩子的孩子.... 所有父哪些有孩子

回答

0

您需要使用递归CTE来达到您的目的。

DECLARE @Id varchar(10)='your_pid' 
;WITH cte AS 
(
    SELECT b.pid, b.chid, b.parent_name 
    FROM parent a inner join child b on b.pid= a.pid 
    WHERE b.pid = @Id 
    UNION ALL 
    SELECT b.pid 
    FROM parent a inner join child b on b.pid= a.pid 
    inner join cte on cte.pid= b.chid 
    WHERE b.pid = @Id ) 
    SELECT parent_name 
    FROM cte 
0

我相信你将需要家长子记录存储在一个单一的表,如下所示:

1 NULL A 
2 1 B 
3 1 C 
4 1 D 
5 2 F 
6 2 G 
7 4 H 
8 4 I 
9 7 J 
10 7 K 
11 9 L 

然后你就可以查询数据如下:

WITH T (id, pid, name) AS (
    SELECT 1, NULL, 'A' 
    UNION ALL 
    SELECT 2, 1, 'B' 
    UNION ALL 
    SELECT 3, 1, 'C' 
    UNION ALL 
    SELECT 4, 1, 'D' 
    UNION ALL 
    SELECT 5, 2, 'F' 
    UNION ALL 
    SELECT 6, 2, 'G' 
    UNION ALL 
    SELECT 7, 4, 'H' 
    UNION ALL 
    SELECT 8, 4, 'I' 
    UNION ALL 
    SELECT 9, 7, 'J' 
    UNION ALL 
    SELECT 10, 7, 'K' 
    UNION ALL 
    SELECT 11, 9, 'L' 
), U AS (
    SELECT B.* FROM T A JOIN T B ON B.pid = A.id JOIN T C ON C.pid = B.id WHERE A.name = 'A' 
    UNION ALL 
    SELECT P.* FROM T P JOIN U Q ON Q.id = P.pid JOIN T R ON R.pid = P.id 
) 
SELECT DISTINCT name FROM U 

对于例如,如果您的表名为“tbl”,则:

WITH T (id, pid, name) AS (
    SELECT id, pid, name FROM tbl 
), U AS (
    SELECT B.* FROM T A JOIN T B ON B.pid = A.id JOIN T C ON C.pid = B.id WHERE A.name = 'A' 
    UNION ALL 
    SELECT P.* FROM T P JOIN U Q ON Q.id = P.pid JOIN T R ON R.pid = P.id 
) 
SELECT DISTINCT name FROM U