вопрос интервью родительского стола sql parent - PullRequest
1 голос
/ 27 июля 2011

Мне задали этот вопрос на собеседовании, но я не был знаком с SQL.Я надеялся, что кто-нибудь может помочь мне в вопросе, чтобы я мог понять концепцию.

"id"  "name"   "parentid"
------------------------
"1"   "BOSS1"  null
"2"   "A"      "1"
"3"   "B"      "1"
"4"   "C"      "3"
"5"   "BOSS2"  null
"6"   "Q"      "5"
"7"   "T"      "6"
  1. По заданному идентификатору найдите все дочерние элементы

, поэтому для 1 следует вывести 1, 2, 3, 4

Iдумаю, что это довольно просто, но я не могу понять, как построить запрос с помощью объединения ...

спасибо

Ответы [ 3 ]

3 голосов
/ 27 июля 2011

Чтобы идти глубже, чем "ребенок", CTE прекрасно работает -

WITH CTEExample (ID, Name, Parent)
    AS
    (
        SELECT e.ID, e.Name, e.Parent 
        FROM dbo.ExampleTable e WHERE e.ID = 1

        UNION ALL

        SELECT e.ID, e.Name, e.Parent 
        FROM dbo.ExampleTable e
        JOIN CTEExample ON e.Parent = CTEExample.ID
    )
   select ID from CTEExample

Это должно вернуть 1,2,3,4.

edit - похоже, что Джон побил меня этим; хотя я думаю, что его четвертая строка должна читать where ID = 1, а не where ParentID = 1

Надеюсь, это поможет.

2 голосов
/ 27 июля 2011

для одного уровня: т.е. все прямые потомки 1

select id,name,parentid
where parentid = 1

вернет 1,2,3

чтобы получить ВСЕХ детей и внуков, и даже больше, если вы используете SQL 2005, вы можете использовать CTE, который включает рекурсию:

http://msdn.microsoft.com/en-us/library/ms190766.aspx

WITH Person_CTE AS (
SELECT id,name,parentid
FROM TableName
WHERE ID = 1
UNION ALL
SELECT ChildTable.id,ChildTable.name,ChildTable.parentid
FROM TableName ChildTable
Inner Join Person_CTE on Person_CTE.ID= ChildTable.parentid
)
SELECT * FROM Person_CTE

SQL вернется и присоединит родителей к детям, пока не найдет детей, которые вернутся

конечно, вы можете использовать Союз, но это вернет только первый и второй уровни (что будет достаточно для вашего набора данных)

0 голосов
/ 27 июля 2011

Приведенный ниже оператор объединения будет делать то, что вы хотите,

select id,name,parentid
from table
where parentid = 1
union
select id,name,parentid
from table
where parentid in (select id
from table
where parentid = 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...