хитрый SQL-запрос - PullRequest
       10

хитрый SQL-запрос

1 голос
/ 17 февраля 2009

Итак, у меня есть эта таблица с 3 столбцами: ID (уникальный ключ), PositionID и SupervisorID. PositionID и SupervisorID являются внешними ключами таблицы позиций.

То, что я не смог выяснить, - это неплохой способ получения унаследованных подчиненных. Так, например:


ID PositionID SupervisorID

1     2           1

2     2           3

3     3           4

4     1           5
...

как я мог бы выбрать 2,3 и 4 в зависимости от их подчиненного положения 1. Текущее решение - довольно грязный способ сделать это, и кажется достаточно распространенной проблемой, что, возможно, существует принятый метод. 1017 *

Спасибо.

Ответы [ 5 ]

4 голосов
/ 17 февраля 2009

Рекурсивные выражения общей таблицы: http://msdn.microsoft.com/en-us/library/ms186243.aspx

2 голосов
/ 17 февраля 2009

Вы можете попробовать:

    WITH HierarchyCTE (ID, PositionID, SupervisorID)
    AS
    (
      SELECT ID, PositionID, SupervisorID
        FROM SomeTable
        WHERE ID = 1
      UNION ALL
      SELECT b.ID, b.PositionID, b.SupervisorID
        FROM SomeTable AS b
        INNER JOIN HierarchyCTE AS c ON b.ID = c.PositionID 
    )
    SELECT ID, PositionID, SupervisorID FROM HierarchyCTE

или что-то близкое к этому должно работать.

2 голосов
/ 17 февраля 2009

Если у вас Microsoft SQL Server 2008, вы должны посмотреть на тип данных HierarchyId . Я думаю, что это именно то, что вы ищете. Вы можете сделать это без этого типа, но тогда вам придется слушать других парней. ;)

1 голос
/ 17 февраля 2009

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

SQL - это реляционная алгебра, а не то, что нужно сгибать в процедурной модели. Если серьезно, используйте для этого код (даже если это хранимая процедура или PL / SQL), это сделает ваш SQL красивее, ваши администраторы баз данных и будущие сопровождающие будут счастливее, а ваша жизнь - более продолжительной и процветающей.

0 голосов
/ 17 февраля 2009

Я написал запросы, чтобы сделать именно эту вещь и взорвать спецификации. Я использовал запрос в цикле while, который выбирает временную таблицу и рекурсивные выражения общих таблиц. Насколько я знаю, это единственный способ без использования рекурсивной функции / sproc - которая не используется в производственной базе данных (на мой взгляд) по разным причинам (во-первых, поскольку сервер sql ограничен 16 уровнями) по умолчанию). Я могу отправить код, если требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...