1. 程式人生 > 其它 >國家地區表的設計

國家地區表的設計

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png


物件相關資料庫管理系統(ORDBMS Object – Oriented Relative DBMS)

1.國家地區表的設計

+-----------+
 | city      |
 |-----------|
 |id         | <---+
 |name       |     |
 |description|    1:n
 |status     |     |
 |parent_id  | o---+
 +-----------+

例6.1.遞迴查詢例項 city 表

定義結構

CREATE TABLE city
(
  id serial NOT NULL,
  name character varying,
  parent_id integer,
  status boolean,
  CONSTRAINT city_pkey PRIMARY KEY (id),
  CONSTRAINT city_parent_id_fkey FOREIGN KEY (parent_id)
      REFERENCES city (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);
ALTER TABLE city
  OWNER TO sys;

插入資料

INSERT INTO city (id, name, parent_id, status) VALUES (1, '廣東', NULL, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (2, '湖南', NULL, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (3, '深圳', 1, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (4, '東莞', 1, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (5, '福田', 3, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (6, '南山', 3, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (7, '寶安', 3, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (8, '西鄉', 7, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (9, '福永', 7, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (10, '龍華', 7, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (11, '長沙', 2, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (12, '湘潭', 2, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (13, '常德', 2, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (14, '桃源', 13, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (15, '漢壽', 13, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (16, '黑龍江', NULL, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (17, '伊春', 16, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (18, '哈爾濱', 16, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (19, '齊齊哈爾', 16, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (20, '牡丹江', 16, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (21, '佳木斯', 16, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (22, '民治', 10, NULL);
INSERT INTO city (id, name, parent_id, status) VALUES (23, '上塘', 10, NULL);

查詢

WITH RECURSIVE path(id, name, path, idpath, parent_id, status) AS (
  SELECT id, name, '/' || name , '/' || id , parent_id, status FROM city WHERE parent_id is null
  UNION
  SELECT
    city.id,
    city.name,
    parentpath.path ||
      CASE parentpath.path
	WHEN '/' THEN ''
	ELSE '/'
      END || city.name,
    parentpath.idpath ||
     CASE parentpath.idpath
	WHEN '/' THEN ''
	ELSE '/'
      END || city.id,
    city.parent_id, city.status
  FROM city, path as parentpath
  WHERE city.parent_id = parentpath.id
)

SELECT * FROM path;

結果輸出

id |   name   |           path            |    idpath    | parent_id | status
----+----------+---------------------------+--------------+-----------+--------
  1 | 廣東     | /廣東                     | /1           |           |
  2 | 湖南     | /湖南                     | /2           |           |
 16 | 黑龍江   | /黑龍江                   | /16          |           |
  3 | 深圳     | /廣東/深圳                | /1/3         |         1 |
  4 | 東莞     | /廣東/東莞                | /1/4         |         1 |
 11 | 長沙     | /湖南/長沙                | /2/11        |         2 |
 12 | 湘潭     | /湖南/湘潭                | /2/12        |         2 |
 13 | 常德     | /湖南/常德                | /2/13        |         2 |
 17 | 伊春     | /黑龍江/伊春              | /16/17       |        16 |
 18 | 哈爾濱   | /黑龍江/哈爾濱            | /16/18       |        16 |
 19 | 齊齊哈爾 | /黑龍江/齊齊哈爾          | /16/19       |        16 |
 20 | 牡丹江   | /黑龍江/牡丹江            | /16/20       |        16 |
 21 | 佳木斯   | /黑龍江/佳木斯            | /16/21       |        16 |
  5 | 福田     | /廣東/深圳/福田           | /1/3/5       |         3 |
  6 | 南山     | /廣東/深圳/南山           | /1/3/6       |         3 |
  7 | 寶安     | /廣東/深圳/寶安           | /1/3/7       |         3 |
 14 | 桃源     | /湖南/常德/桃源           | /2/13/14     |        13 |
 15 | 漢壽     | /湖南/常德/漢壽           | /2/13/15     |        13 |
  8 | 西鄉     | /廣東/深圳/寶安/西鄉      | /1/3/7/8     |         7 |
  9 | 福永     | /廣東/深圳/寶安/福永      | /1/3/7/9     |         7 |
 10 | 龍華     | /廣東/深圳/寶安/龍華      | /1/3/7/10    |         7 |
 22 | 民治     | /廣東/深圳/寶安/龍華/民治 | /1/3/7/10/22 |        10 |
 23 | 上塘     | /廣東/深圳/寶安/龍華/上塘 | /1/3/7/10/23 |        10 |
(23 rows)


轉載於:https://my.oschina.net/neochen/blog/115491