繁体   English   中英

自引用外键 Select

[英]Self-Referencing Foreign Key Select

我有一个表结构:

地区:

  • 标识(键)
  • parent_region(外键 - 引用另一个区域)
  • 姓名

假设我有以下 3 行:

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

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

SELECT ... 
  FROM region 
 WHERE id = 2

...并返回 3 行。 我正在使用Java / JDBC,所以很明显我可以以编程方式select 3行一一...

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

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;

(如果您有循环,这将无限循环。有关如何避免这种情况的说明,请参见此处。)

这个查询:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM