2013-09-27 219 views
7

Tôi có dữ liệu sau trong cơ sở dữ liệu của tôi:Bắt tất cả các trẻ em của một phụ huynh sử dụng MSSQL truy vấn

Parent  Child 
101   102 
101   103 
101   104 
101   105 
101   106 

tham số của tôi là 106. Và sử dụng các thông số tôi muốn lấy tất cả những đứa trẻ khác theo cha mẹ của nó mà là 101. Tôi đã thử sử dụng phương pháp đệ quy nhưng nó không hoạt động với các dữ liệu sau. Có cách nào khác để xây dựng một truy vấn?

Trả lời

-1
select child 
from my_table T1 
where exists (select 1 from my_table T2 where child = @parameter and T1.parent = T2.parent) 
+6

Một chút giải thích với mã luôn tốt đẹp. –

14

Giả sử bạn muốn nhận được anh chị em giá trị @p0, bạn có thể sử dụng một cách đơn giản tự tham gia:

SELECT p.Child 
FROM Table1 c 
INNER JOIN Table1 p ON c.Parent = p.Parent 
WHERE c.Child = @p0 
AND p.Child <> @p0 

Mệnh đề không-bình đẳng ở đây làm cho chắc chắn bạn sẽ có được anh chị em không bao gồm giá trị bạn đã tìm kiếm. Loại bỏ nó khi cần thiết.

SQL Fiddle example


Kể từ khi bạn đề cập đến đệ quy mặc dù, có lẽ bạn muốn toàn bộ cây bắt đầu từ phụ huynh của các giá trị @p0. Trong trường hợp này, bạn có thể sử dụng một CTE đệ quy:

ví dụ
WITH parent AS (
    SELECT Parent 
    FROM Table1 
    WHERE Child = @p0 
), tree AS (
    SELECT x.Parent, x.Child 
    FROM Table1 x 
    INNER JOIN parent ON x.Parent = parent.Parent 
    UNION ALL 
    SELECT y.Parent, y.Child 
    FROM Table1 y 
    INNER JOIN tree t ON y.Parent = t.Child 
) 
SELECT Parent, Child 
FROM tree 

SQL Fiddle using your datawith additional data to demonstrate the recursive CTE

+1

tôi đã sử dụng truy vấn đầu tiên cảm ơn bạn – waine

+0

anh chị em? Nhưng anh ấy đã viết "Bắt * tất cả * ** con ** của một phụ huynh ..." Làm thế nào tôi có thể nhận được tất cả các cây con của một giá trị nhất định (cha mẹ) - gốc của một cây con? – candlejack

+0

@alessadro và theo định nghĩa, những đứa con khác của bố mẹ bạn là anh chị em của bạn? –

-1
WITH parent AS (
    SELECT Parent 
    FROM Table1 
    WHERE Child = @p0 
), tree AS (
    SELECT x.Parent, x.Child 
    FROM Table1 x 
    INNER JOIN parent ON x.Parent = parent.Parent 
    UNION ALL 
    SELECT y.Parent, y.Child 
    FROM Table1 y 
    INNER JOIN tree t ON y.Parent = t.Child 
) 
SELECT Parent, Child 
FROM tree