SQL WITH RECURSIVE作为subselect?

时间:2018-04-05 13:41:13

标签: sql postgresql common-table-expression

我有两张桌子:

  • 留下(uid,building_unit_uid)
  • building_unit(uid,building_unit_uid,type)

building_unit_uid是当前building_unit所属的building_unit,即一个是房间并指向一个楼层。地板指向建筑物。

住宿会指向一个房间。

我需要每次入住都能获得建筑物。

我设法手动使用WITH RECURSIVE来查找给定building_unit的建筑物:

https://www.db-fiddle.com/f/gQnYbShBaDqxa6rQBQtTRG/1

create table stay(uid int, building_unit_uid int);
create table building_unit(uid int, building_unit_uid int, type int);
insert into building_unit (uid, building_unit_uid, type) values (1, null, 1), (2, 1, 2), (3, 1, 2), (4, 2, 3), (5, 2, 3), (6, 3, 3), (7, 3, 3);
insert into stay (uid, building_unit_uid) values (1, 6), (2, 7);

WITH RECURSIVE building(uid, building_unit_uid, type) AS (
  SELECT building_unit.uid, building_unit.building_unit_uid, building_unit.type
  FROM building_unit
  WHERE building_unit.uid = 7
  UNION
  SELECT b.uid, b.building_unit_uid, b.type
  FROM building_unit AS b
  INNER JOIN building AS bu ON bu.building_unit_uid = b.uid
  )
  SELECT * FROM building WHERE type = 1

我需要的是使用连接的建筑物uid为它的building_unit_uid保持查询。我不知道如何使用WITH RECURSIVE查询作为逗留查询的子查询,或者我是否可以加入它们或其他任何东西。

所需的输出是:

uid building_unit_uid parent_building_unit_uid
1   6                 1
2   7                 1

0 个答案:

没有答案