自引用外键选择

时间:2011-04-28 03:04:08

标签: mysql sql

我有一个表结构:

区:

  • id(key)
  • parent_region(外键 - 引用其他区域)
  • 名称

假设我有以下3行:

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

我希望能够通过查询id来选择美国佐治亚州亚特兰大:

SELECT ... 
  FROM region 
 WHERE id = 2

...并返回3行。我正在使用Java / JDBC,所以很明显我可以逐个编程地选择3行......但我很好奇是否有一种聪明的SQL方法。

我正在使用MySQL,但我也对Oracle或Informix解决方案感到好奇。

2 个答案:

答案 0 :(得分:2)

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;

(这将无限循环,如果您有周期。请参阅here以获取有关如何避免此问题的说明。)

答案 1 :(得分:0)

此查询:

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)