2017-05-08 110 views
2

无论如何要在多个潜在条件下连接两个表?BigQuery - 使用子查询和OR语句连接多个条件

我目前正在迁移一些代码的Postgres至BigQuery,我加入了像多潜能值:

SELECT 
* 
FROM 
(
SELECT 
    offer_table.offer_id 
    ,customer_table.customer_name 
    ,customer_table.visit_count 
    ,ROW_NUMBER() OVER (PARTITION BY offer_table.offer_id ORDER BY customer_table.visit_count DESC) AS customer_visit_rank 
FROM 
    offer_table 
    LEFT JOIN customer_table ON 
    (
    offer_table.customer_id = customer_table.customer_id 
    OR offer_table.email = customer_table.email 
    OR offer_table.phone = customer_table.phone 
    ) 
) dummy 
WHERE 
    customer_visit_rank = 1 

我需要这个,因为我的提议和客户数据有我们的ID,电子邮件的使用不一致,和电话字段,但都是有效的潜在匹配。如果多个字段工作(例如:id和电子邮件匹配),会有重复的行,我会在使用ORDER BY部分进行排名后,根据row_number列将其过滤掉。

然而,当我尝试加入对BigQuery中的多个条件,我得到这个错误信息:

LEFT OUTER JOIN cannot be used without a condition that is an equality of fields from both sides of the join.

有没有人想出了一个解决方案,加入多个值,而不是做上述?

+0

你能为这三个'JOIN ON'条件下每一个运行三个单独的查询,然后使用'UNION'或'UNION ALL合并结果'?青睐'UNION ALL',因为它只会追加找到的行,并且不需要排序来删除重复项,就像'UNION'必须的一样。 所以基本上'选择...在customer_id ...联盟所有选择...在电子邮件...联盟所有选择...在电话'。如果这是正确的,我可以给它一个答案吗? – flutter

+2

使用标准SQL。 –

+0

@ flutter这样做你不会有每个offer_id重复的行吗?我试图根据具有正确数据的customer_table行(在此示例中为最高的visit_count)匹配每个offer_id的唯一行。 –

回答

1

您可以编写单独的查询,然后使用COALESCE

SELECT 
    * 
FROM 
    (
    SELECT 
     offer_table.offer_id 
     ,COALESCE(c1.customer_name,c2.customer_name,c3.customer_name) 
     ,COALESCE(c1.visit_count,c2.visit_count,c3.visit_count) 
     ,ROW_NUMBER() OVER (PARTITION BY offer_table.offer_id ORDER BY customer_table.visit_count DESC) AS customer_visit_rank 
    FROM 
     offer_table 
    LEFT JOIN customer_table c1 
     ON offer_table.customer_id = customer_table.customer_id 
    LEFT JOIN customer_table c2 
     ON offer_table.email = customer_table.email 
    LEFT JOIN customer_table c3 
     ON offer_table.phone = customer_table.phone 
    ) 
) AS dummy 
WHERE 
    customer_visit_rank = 1