Sql 联合
我想我已经接近解决方案了,但还没有完全解决。我有两个表,如果给定的ID存在,我想将它们连接起来,但是如果该ID不存在,我想将它们作为连接条件延迟到不同的列 比如:Sql 联合,sql,google-bigquery,Sql,Google Bigquery,我想我已经接近解决方案了,但还没有完全解决。我有两个表,如果给定的ID存在,我想将它们连接起来,但是如果该ID不存在,我想将它们作为连接条件延迟到不同的列 比如: T1: session, ID, path 1001, 1, homepage 1001, NULL, about T2: ID, path, type 1, homepage, A 2, about, Z 达到了预期的效果: session, ID, path, type 1001, 1, homepage, A 1001,
T1:
session, ID, path
1001, 1, homepage
1001, NULL, about
T2:
ID, path, type
1, homepage, A
2, about, Z
达到了预期的效果:
session, ID, path, type
1001, 1, homepage, A
1001, 2, about, Z
我试过这样做:
select * from t1 inner join t2
on (t1.id = t2.id) or (t1.path = t2.path)
但这会产生一些意想不到的重复。我想做一些像
select * from t1 inner join t2
on coalesce(t1.id, t1.path) = t2.id
但这不会正常工作,因为路径不会映射到另一个表中的ID
有什么想法或建议吗 您需要一个默认值。下面是一种使用两个
左连接的方法:
select t2.*, coalesce(t1.path, t1d.path) as path
from t2 left join
t1
on t1.id = t2.id left join
t1 t1d
on t1d.id is null;
下面是BigQuery标准SQL的示例
#standardSQL
WITH `project.dataset.table1` AS (
SELECT 1001 session, 1 id, 'homepage' path UNION ALL
SELECT 1001, NULL, 'about'
), `project.dataset.table2` AS (
SELECT 1 id, 'homepage' path, 'A' type UNION ALL
SELECT 2, 'about', 'Z'
)
SELECT
session,
IFNULL(t1.id, t2.id) id,
IFNULL(t1.path, t2.path) path,
type
FROM `project.dataset.table1` t1
JOIN `project.dataset.table2` t2
ON (t1.id = t2.id) OR (t1.path = t2.path)
有输出
Row session id path type
1 1001 1 homepage A
2 1001 2 about Z
我意识到只有当一个或两个id
为空时,您才可能希望基于path
列加入。在这种情况下,您的ON条款应如下所示
ON t1.id = t2.id
OR (
(t1.id IS NULL OR t2.id IS NULL)
AND t1.path = t2.path
)
我能想到的最好办法是:
select
t1.session,
coalesce(t1.ID, t2.ID) as ID,
t2.path,
t2.type
from
t1
inner join t2 on
(t1.ID = t2.ID) or
(t1.ID is null and t1.path = t2.path)
但这可能仍然会产生不需要的重复。我无法判断您的数据设计,但如果结果重复,则问题可能出现在表t1
和/或t2
中有问题(重复和/或不明确)的数据中
我还立即意识到,表t1
中的字段ID
显然可以为空。在我看来,这意味着表t1
和t2
之间的关系可以被认为是“可选的”。如果不是,最好将表t1
中的字段ID
定义为所需值。举个例子-什么是预期输出?添加了预期输出。本来应该更清楚。请显示获得“意外副本”的示例数据。使用您显示的示例数据,您将得到您想要的结果。