【问题标题】:Joining tables with itself SQL将表与自身连接 SQL
【发布时间】:2020-06-22 09:23:09
【问题描述】:

我正在尝试在我们服务器的文件夹结构的 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 中看到的答案,如下所示: 选择 b.姓名, b.parent_project_id 为空时的情况,然后是“根” ELSE b.parent_project_id END as parent_folder_name , a.name, a.owner_id FROM data a 加入数据 b 在 b.parent_project_id = a.id

它实际上返回了很好的结果,但是大约 60% 的注册表丢失了,我不明白为什么 提前致谢

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    要获取父级,请使用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 JOINs 以在层次结构中更高。不幸的是,BigQuery 不支持递归 CTE,因此无法使用单个查询来遍历整个层次结构。令人高兴的是,BigQuery 确实支持脚本,因此您可以使用脚本语言表达这种遍历。

    【讨论】:

    • 完美!!必须为以下内容替换合并:当 dp.parent_project_id 为 null 时的情况,然后 'root' 否则 dp.name 以 parent_folder_name 结尾,
    猜你喜欢
    • 1970-01-01
    • 2019-12-02
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    相关资源
    最近更新 更多