Выбор внешнего ключа с собственной ссылкой - PullRequest
0 голосов
/ 28 апреля 2011

У меня есть структура таблицы:

Регион:

  • id (ключ)
  • parent_region (внешний ключ - указывает на другой регион)
  • name

Предположим, у меня есть следующие 3 строки:

[ id, parent_region, name ]
(0, NULL, "USA")
(1, 0, "Georgia")
(2, 1, "Atlanta")

Я хочу иметь возможность выбрать Атланту, штат Джорджия, США, запросив идентификатор:

SELECT ... 
  FROM region 
 WHERE id = 2

... и вернуть 3 строки.Я использую Java / JDBC, так что, очевидно, я мог бы программно выбирать 3 строки одну за другой ... но мне любопытно, если есть разумный способ SQL сделать это.

Я использую MySQL, ноМне также было бы интересно узнать о решении Oracle или Informix.

Ответы [ 2 ]

2 голосов
/ 28 апреля 2011

MySQL не имеет рекурсивных SELECT, что слишком плохо для этой проблемы.

Для этого было придумано предложение WITH RECURSIVE.Это работает в PostgreSQL, и что-то очень близкое или идентичное в Oracle.

WITH RECURSIVE T(id, parent_region, name) AS
 SELECT id, parent_region, name FROM region WHERE id=2
 UNION
 SELECT id, parent_region, name FROM region JOIN T
   ON (region.parent_region = T.id) IS TRUE -- IS TRUE forces T.id NOT NULL
SELECT id, parent_region, name FROM T;

(Это будет работать бесконечно, если у вас есть циклы. См. здесь для объяснения того, как этого избежать.)

0 голосов
/ 28 апреля 2011

Этот запрос:

select a.name, b.name, c.name 
from region a, region b, region c  
where a.parent_region = b.id and b.parent_region = c.id and a.id = 2;

Произвел эти результаты

+---------+---------+------+
| name    | name    | name |
+---------+---------+------+
| Atlanta | Georgia | USA  |
+---------+---------+------+
1 row in set (0.00 sec)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...