Иерархический SQL-запрос - PullRequest
       15

Иерархический SQL-запрос

1 голос
/ 30 августа 2009

У меня есть таблица со ссылками на себя (клиенты) и таблица, которая будет ссылаться на одну запись в этой таблице (компании), т.е.

Customers      Companies
*********      *********
ID             ID
ManagerID  --> DirectorID

ManagerID относится к другой записи в таблице Customer.

Мне нужно выполнить запрос, в котором по заданному идентификатору клиента будет найдена компания, к которой принадлежит клиент. Если бы я делал это в C #, это выглядело бы примерно так (это пример кода, а не функционал):

public static Company FindCompany(Customer customer)
{
     while (customer.ManagerID != null)
     {
          customer = customer.GetManager();
     }
     return Company.FindByDirector(customer.ID);
}

Итак, есть 2 шага:

1) Просматривать таблицу клиентов (через ManagerID), пока мы не найдем клиента без ManagerID. (Директор)

2) Найти компанию, относящуюся к этому клиенту.

Кто-нибудь может мне помочь?

Спасибо.

1 Ответ

3 голосов
/ 30 августа 2009

Как-то так, но не проверено.

На основе CTE Рекурсивные запросы с использованием общих табличных выражений

WITH cTE AS
(
    SELECT --Get manager of given customer
        ManagerID
    FROM
        Customers
    WHERE
        ID = @MyCustomerID
    UNION ALL
    SELECT --Get manager of the manager etc
        Customers.ManagerID
    FROM
        cTE
        JOIN
        Customers ON cTE.ManagerID = Customers.ID
)
SELECT
    *
FROM
    cTE
    JOIN
    Company ON cTE.ManagerID = Company.DirectorID
...