SQL 从 N 个表中选择唯一的外键

Posted

技术标签:

【中文标题】SQL 从 N 个表中选择唯一的外键【英文标题】:SQL Select unique foreignkey from N tables 【发布时间】:2020-07-25 00:13:24 【问题描述】:

我遇到了以下问题,想知道是否可以通过 Google BigQuery 中的查询来解决。

收到此查询;

SELECT destination.Id, destination.SomeColumn,
(SELECT NewId FROM table1 where OldId = destination.ForeignKeyColumn) as ForeginKeyColumn,
-- some more things
FROM MyDestinationTable destination;

我有一个名为 MyDestinationTable 的表,其 ForeignKeyColumn 具有旧外键 id,因此我需要从 table1 中选择具有新外键的 ForeignKeyColumn(table1 具有新旧外键)。

嗯,这是我已经解决的问题的一部分,当我与多个表有关系时,问题就出现了,比如 ForeignKeyColumn 与 table1 或 table2 或 tableN 有关系,即;

row 1: destination.ForeignKeyColumn may have a reference ONLY in table1
row 2: destination.ForeignKeyColumn may have a reference ONLY in table3
row 3: destination.ForeignKeyColumn may have a reference ONLY in table10

外键可能仅存在于 N_tables 的一个表中,具有此部分;

(SELECT NewId FROM table1 where OldId = destination.ForeignKeyColumn) as ForeginKeyColumn,

是否可以在 N 个表中搜索 NewId 直到找到它(仅在该部分中)?

从table1到tableN

table1 中有类似 NewId 的东西吗?不,那么 table2 中的 NewId 呢?不,那么 table3 中的 NewId 呢?是的,将其作为 ForeginKeyColumn 并不要查看其余的表(同样,新的外键仅存在于 N 个表中的一个表上)。

如果有可能对如何做有任何想法吗?需要提一下,我在这类查询上做得很差。

问候!

【问题讨论】:

【参考方案1】:

我建议多个left joins 和coalesce()

select d.*, coalesce(t1.newid, t2.newid, . . . )
from MyDestinationTable d left join
     table1 t1
     on t1.oldid = d.ForeignKeyColumn left join
     table1 t2
     on t2.oldid = d.ForeignKeyColumn left join
     . . . 

【讨论】:

COALESCE 完全奏效了我不必使用循环和更复杂的代码来执行 SP/Function,我对您的示例进行了一些调整,但完全让我走上了正轨!

以上是关于SQL 从 N 个表中选择唯一的外键的主要内容,如果未能解决你的问题,请参考以下文章

使用外键关系更新从另一个表中选择的电子邮件

是否可以将一个表中的主键引用为超过 2 个表的外键约束?

存储来自 2 个表 Laravel 的外键值

如何编写一个查询,根据 ms 访问的子表中的外键获取信息?

sql 添加外键语句

如何在sql中使用2个以上的外键显示数据?