首页 > 解决方案 > 将表与自身连接 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% 的注册表丢失了,我不明白为什么提前谢谢

标签: sqlgoogle-bigquery

解决方案


要仅获取父级,请使用 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 确实支持脚本,因此您可以使用脚本语言来表达这样的遍历。


推荐阅读