Отношения родительских и дочерних записей в SQL? - PullRequest
3 голосов
/ 09 февраля 2010

Мне нужно выяснить, как лучше всего в SQL запрашивать отношения между родителями и детьми. Некоторые из родительских полей будут данными для ребенка. Вот пример:

ID     Field1       Field2         ParentId
--------------------------------------------
1      stuff        moreStuff      0
2      childStuff   (from parent)  1

Итак, Field2 для ребенка будет значением того, кем является родитель. Мне нужно выяснить, как написать свой SQL, чтобы при извлечении записей Field @ для дочернего элемента получило значение «moreStuff». Я использую SQL Server 2008. Спасибо.

Ответы [ 5 ]

2 голосов
/ 09 февраля 2010

Предполагая, что Field2 не может быть NULL, вы можете использовать левое соединение с COALESCE:

SELECT T1.ID, T1.Field1, COALESCE(T2.Field2, T1.Field2) AS Field2, T1.ParentID
FROM Table1 T1
LEFT JOIN Table1 T2
ON T1.ParentID = T2.ID

Если это поле Field2 может быть NULL, замените выражение coalesce следующим:

CASE WHEN T2.Id IS NULL THEN T1.Field2 ELSE T2.Field2 END AS Field2
1 голос
/ 09 февраля 2010

Вот очень хорошая статья о хранении иерархических данных в базе данных, ориентированной на пользователей PHP / MySQL: http://articles.sitepoint.com/article/hierarchical-data-database

1 голос
/ 09 февраля 2010

Для такого рода иерархических запросов характерно наличие корневого узла, первопричины, родителя, который сам не является дочерним. То есть записи, где ParentId равно нулю (или в вашем случае 0, который, я полагаю, не является реальным идентификатором). Если это так, то вам нужно использовать ВНЕШНЕЕ соединение, а не ВНУТРЕННЕЕ ...

SELECT parent.Field1, parent.Field2, child.ID 
FROM myTable child 
    LEFT OUTER JOIN myTable parent 
    ON child.ParentId = parent.ID 
/
1 голос
/ 09 февраля 2010

Используйте самостоятельное соединение на столе:

SELECT parent.Field1, parent.Field2, child.ID
FROM myTable child
  INNER JOIN myTable parent
  ON child.ParentId = parent.ID
1 голос
/ 09 февраля 2010

В этом случае самостоятельное соединение должно помочь вам.

SELECT child.ID, 
       child.Field1, 
       parent.Field2, 
       child.ParentID
FROM   MyTable child JOIN MyTable parent ON child.ParentID = parent.ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...