Запрос SQl требуется для приведенного ниже сценария - PullRequest
0 голосов
/ 01 октября 2010

alt text

Здесь для части 'CF061W' финал равен 25, я выберу записи, значение fparinum которых равно 25, теперь я получу эти части FA061W, HRD20600 и SD1201. Теперь снова я выберу записи, чье значение fparinum является числом из вышеупомянутых извлеченных частей FA061W, HRD20600 и SD1201 и так далее. Это должно продолжаться до самого высокого уровня (уровень), для вышеприведенной таблицы до уровня 4.

Теперь мне нужен один SQL-запрос, который будет извлекать все записи для родительской части "CF061W".

Заранее спасибо

Прадип

Ответы [ 3 ]

1 голос
/ 01 октября 2010

У меня могут быть столбцы условий соединения: INNER JOIN PartHierarchy ph ON n.finum = ph.fparinum неправильный путь (не знаком с вашей схемой).

WITH PartHierarchy (finum, part, fparinum , dsono, flevel) AS
(
   -- Base case
   SELECT
      finum, 
      part, 
      fparinum, 
      dsono, 
      1 as flevel
   FROM myTablename
   WHERE fparinum  = 0

   UNION ALL

   -- Recursive step
   SELECT
      n.finum, 
      n.part, 
      n.fparinum, 
      n.dsono, 
      ph.flevel + 1 AS flevel
   FROM myTablename n
      INNER JOIN PartHierarchy ph ON n.finum = ph.fparinum 
)

SELECT *
FROM PartHierarchy 
ORDER BY flevel 

Это классический рекурсивный CTE (Common Table Expression)

1 голос
/ 01 октября 2010

это будет работать для вас

WITH TAB_CTE AS (
SELECT finum, part, fparinum, flevel
FROM TABTEST
WHERE  PART='CF061W'
UNION ALL
SELECT e.finum, e.part, e.fparinum,   e.flevel
FROM TABTEST e
INNER JOIN TAB_CTE ecte ON ecte.finum = e.fparinum 
)
SELECT *
FROM TAB_CTE

OUTPUT

finum       part           fparinum flevel
25          CF061W          0           1
26          FA061w          25          2
27          hrd20600        25          2
35            sd1201        25              2
28          f1024           27          3
0 голосов
/ 01 октября 2010

Это почти учебный пример того, когда использовать рекурсивный CTE.

Есть множество статей, подробно описывающих, что делать. например. этот на MSDN: http://msdn.microsoft.com/en-us/library/ms186243.aspx

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