помощь по левому внешнему соединению с отношениями родитель-ребенок - PullRequest
1 голос
/ 11 мая 2011

У меня есть следующая таблица в моей базе данных:

id   grp#  code  parent#
--   ----  ----  -------
 0     10  US       NULL     
 0     30  SF         10 
 1     10  S        NULL 
 1     30  SF         10

Исходя из этого, учитывая идентификатор и grp #, мне нужно вернуть список детей и код для grp #.Если детей не существует, он должен вернуть NULL.

Так, например: для id = 0, grp # = 10 он должен вернуть US, 30 и для id = 0, grp # = 30 должен вернуть SF, NULL

Примечание: тамНе должно быть дубликатов в выводе.

1 Ответ

2 голосов
/ 11 мая 2011

Итак, вот ваши тестовые данные:

SQL> select * from t42
  2  /

        ID       GRP# CODE                    PARENT#
---------- ---------- -------------------- ----------
         0         10 US
         0         30 SF                           10
         1         10 S
         1         30 SF                           10

SQL>

А вот запрос, который возвращает желаемые результаты:

SQL> select p.code
  2         , c.grp# as child_grp#
  3  from t42 p
  4       left outer join t42 c
  5        on ( c.parent# = p.grp# )
  6  where p.id = &id
  7  and p.grp# = &grp
  8  /
Enter value for id: 0
old   6: where p.id = &id
new   6: where p.id = 0
Enter value for grp: 10
old   7: and p.grp# = &grp
new   7: and p.grp# = 10

CODE                 CHILD_GRP#
-------------------- ----------
US                           30
US                           30

SQL> r
  1  select p.code
  2         , c.grp# as child_grp#
  3  from t42 p
  4       left outer join t42 c
  5        on ( c.parent# = p.grp# )
  6  where p.id = &id
  7* and p.grp# = &grp
Enter value for id: 0
old   6: where p.id = &id
new   6: where p.id = 0
Enter value for grp: 30
old   7: and p.grp# = &grp
new   7: and p.grp# = 30

CODE                 CHILD_GRP#
-------------------- ----------
SF

SQL>

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

Конечно - при условии, что вы можете указать дополнительное бизнес-правило.

Самый простой выход - развернуть ключевое слово DISTINCT,последнее средство неработающего запроса.

...