将表与自身连接 SQL

Posted

技术标签:

【中文标题】将表与自身连接 SQL【英文标题】:Joining tables with itself 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% 的注册表丢失了,我不明白为什么 提前致谢

【问题讨论】:

【参考方案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 结尾,

以上是关于将表与自身连接 SQL的主要内容,如果未能解决你的问题,请参考以下文章

如何将表与中间表和附加相关列spring hibernate mvc连接起来

PostgreSQL同表左外连接多表

如何将表连接在一起 - SQL

SQL - 将聚合表与非聚合表连接起来

在 BigQuery 中展平嵌套层次结构

即使右表与 where 不匹配也显示左表的 SQL 连接