Сложный иерархический запрос и объединение - PullRequest
1 голос
/ 02 марта 2011

(Примечание: данные здесь являются вымышленным примером, поскольку я не могу опубликовать реальные данные. Бесполезно утверждать, что структура таблицы не имеет смысла или должна измениться)

База данных - Oracle 10g.

Дано:

Products
------------
ID
Price

Sample Data:
ID Product_ID Customer Quantity
-------------------------
1  30          2        10
2  40          2        15
3  50          5        7
4  60          5        9


Product_types
-----------
ID
Name
Parent
Type

Data
ID Product_ID  Name        Parent    
----------------------------------
1  10          Box                    
2  20          Toolbox     10      
3  30          Hammer      20     
4  40          Nail        30 

Запрос:

select * from (select * from Product_types t
START WITH t.Parent = 20
CONNECT BY PRIOR t.Product_ID = t.PARENT) t_result
left join Products p on T_RESULT.Product_ID = P.Product_ID
where P.Customer = 2;

Токовый выход:

Product_ID  Name      Parent     Product_ID_1   Customer   Quantity
-------------------------------------------------------------------
30          Hammer    20         30             2          10
40          Nail      30         40             2          15

Желаемый вывод:

Product_ID  Name      Parent     Product_ID_1   Customer   Quantity
---------------------------------------------------------------------
20          Toolbox   10
30          Hammer    20         30               2          10
40          Nail      30         40               2          15

Я понимаю, что это только выбор строк с customer = 2 из-за моего предложения where.Тем не менее, мне интересно, есть ли способ достичь вершины иерархии.Моей первой мыслью было, что левое соединение должно по-прежнему предоставлять строку Toolbox с NULL-клиентом, но эта строка не включена.Я также попытался выполнить полное внешнее объединение.

Я подозреваю, что мне может потребоваться выполнить два запроса и объединить результаты вручную, чтобы получить желаемый результат, но сначала я хотел проконсультироваться с некоторыми экспертами.

Может кто-нибудь придумать способ получить желаемый результат?

Ответы [ 2 ]

3 голосов
/ 02 марта 2011

Работает ли это?

select * from  
(select * from Product_types t
 START WITH T.Parent = 20 
 CONNECT BY PRIOR t.Product_ID = t.PARENT) t_result
left join Products p on T_RESULT.Product_ID = P.Product_ID
AND P.Customer = 2;

Примечание. Я изменил WHERE на AND в последней строке, чтобы сделать условие частью внешнего соединения.

0 голосов
/ 02 марта 2011

Также вы должны изменить начальную точку рекурсии:

SELECT *
FROM (
  SELECT *
  FROM Product_types t
  START WITH t.Parent = 10 
  CONNECT BY PRIOR t.Product_ID = t.PARENT
) t_result
LEFT OUTER JOIN Products p 
  ON T_RESULT.Product_ID = P.Product_ID
  AND P.Customer = 2
;

Или даже использовать START WITH t.Parent IS NULL, чтобы получить полную рекурсию.

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