将表与自身连接 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 JOIN
s 以在层次结构中更高。不幸的是,BigQuery 不支持递归 CTE,因此无法使用单个查询来遍历整个层次结构。令人高兴的是,BigQuery 确实支持脚本,因此您可以使用脚本语言表达这种遍历。
【讨论】:
完美!!必须为以下内容替换合并:当 dp.parent_project_id 为 null 时的情况,然后 'root' 否则 dp.name 以 parent_folder_name 结尾,以上是关于将表与自身连接 SQL的主要内容,如果未能解决你的问题,请参考以下文章