【发布时间】:2021-05-06 15:38:23
【问题描述】:
我有 2 个具有以下数据结构的 SQL 表:
表 1:收藏夹
列:
- pk
- fk_user(用户表暂时不相关)
- fk_tree_node
表 2:树
列:
- pk
- fk_parent_node
我想创建一个视图,以便我可以查询某个节点是否是收藏节点的收藏/后代。因此,对于 FAVORITES 中的每个条目,视图都会有几个条目,其中用户与收藏的节点或其后代相关联。
查看:FAV_OR_DESCENDANT
列:
- fk_tree_node
- fk_user
- pk
查询会这样工作
SELECT *
FROM FAV_OR_DESCENDANT
WHERE fk_user = 0
对于给定的树,我期望得到的结果如下所示:
树:
TREE:
+--------+----+----------------+
| rownum | pk | pk_parent_node |
+--------+----+----------------+
| 1 | 1 | null |
| 2 | 2 | 1 |
| 3 | 3 | 2 |
| 4 | 4 | 1 |
+--------+----+----------------+
FAVORITES:
+--------+----+---------+--------------+
| rownum | pk | fk_user | fk_tree_node |
+--------+----+---------+--------------+
| 1 | 0 | 0 | 1 |
+--------+----+---------+--------------+
Tree representation:
1 <-- User 0 has only favorited this single node
/ \
2 4
/
3
FAV_OR_DESCENDANT 中的结果数据:
+--------+---------+--------------+
| rownum | fk_user | fk_tree_node |
+--------+---------+--------------+
| 1 | 0 | 1 |
| 2 | 0 | 2 |
| 3 | 0 | 3 |
| 4 | 0 | 4 |
+--------+---------+--------------+
如果我要查询特定用户的所有收藏节点/后代节点,我知道如何编写此查询。但是,我正在努力将其转换为可以创建视图的 SQL 查询:
SELECT DISTINCT *
FROM tree
START WITH tree.pk IN (
SELECT fk_tree_node
FROM favorites
WHERE fk_user = 0
)
CONNECT BY PRIOR tree.pk = tree.fk_parent_node
我发现的其他问题更集中于查询或不受 SQL 限制。对于正确方向的每一个提示,我将不胜感激。
【问题讨论】:
-
请提供实际的表定义(ddl - 如果需要,只删除相关列)和示例数据,如 formatted test - 没有图像。甚至是fiddle
-
什么是
category_lid。为什么在你的 SQL 尝试中你有select * from tree当从所需的输出中很明显你希望第一列来自另一个表?
标签: sql oracle view tree relational-database