我有一个表结构:
区:
假设我有以下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解决方案感到好奇。
答案 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)