[英]Self-Referencing Foreign Key Select
我有一个表结构:
地区:
假设我有以下 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.