sql - 将表与自身连接 SQL
问题描述
我正在尝试在我们服务器的文件夹结构的 SQL BigQuery 中生成一个表。我想要一个包含文件名称及其所在文件夹的表。问题是它所属的文件夹以及它包含的子文件夹的信息在同一个表中,并且它可以有任意数量的文件夹级别,像这样:
folder_id Name parent_folder_id
123 One 321
321 root_1 null
456 two 321
789 Three 456
我想要这样的表:
parent_folder_name name
root_1 One
'root' root_1
root_1 two
two three
但我无法正确迈出第一步,即将每个文件和文件夹与其父级连接。我正在修改我在 SO 中看到的答案,如下所示:SELECT b.name, CASE when b.parent_project_id is null then 'root' ELSE b.parent_project_id END as parent_folder_name , a.name, a.owner_id FROM data a JOIN 数据 b 上 b.parent_project_id = a.id
它实际上返回了很好的结果,但是大约 60% 的注册表丢失了,我不明白为什么提前谢谢
解决方案
要仅获取父级,请使用 a left join
,大概是:
SELECT d.name,
(CASE WHEN dp.parent_project_id is null THEN 'root' ELSE dp.name END) as parent_folder_name,
dp.name as parent_folder_name, d.name, d.owner_id
FROM data d1 LEFT JOIN
data dp
ON d.parent_project_id = dp.id;
您可以添加额外LEFT JOIN
的 s 以在层次结构中更高。不幸的是,BigQuery 不支持递归 CTE,因此无法使用单个查询来遍历整个层次结构。令人高兴的是,BigQuery 确实支持脚本,因此您可以使用脚本语言来表达这样的遍历。
推荐阅读
- node.js - 无法完成离子启动命令
- python - Keras.backend.constant() 错误(无法将符号张量(Shape_1:0)转换为 numpy 数组)
- r - R tidyverse 与分组数据框中列子集的所有组合发生变异
- c++ - 将 if 条件按位转换为通常 if 条件
- python - 根据 Dataframe 中的索引值将 Pandas Dataframe 拆分为多个 Excel 工作表
- python - 为什么 imshow 不能正确显示一个充满矩阵的矩阵?
- django - Heroku 上的 Django 应用:部署后持续开发的问题
- vue.js - 与模板文字的属性绑定在 vuejs 组件中不起作用?
- php - 如何使用雄辩的ORM在laravel中根据post ip地址从表中获取记录
- php - Laravel:在发送电子邮件之前执行查询