Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 联合_Sql_Google Bigquery - Fatal编程技术网

Sql 联合

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,

我想我已经接近解决方案了,但还没有完全解决。我有两个表,如果给定的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, 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
定义为所需值。

举个例子-什么是预期输出?添加了预期输出。本来应该更清楚。请显示获得“意外副本”的示例数据。使用您显示的示例数据,您将得到您想要的结果。