我在GBQ中遇到了我不理解的查询结果,也无法解释。
我正在尝试连接具有完全相同架构结构的两个表,并且可能有重复项。
我希望将两个表连接起来,取得table1中的所有行以及table2中基于唯一id在table1中不存在的任何其他行。这是一种非常常见的连接方案。
所以,为了测试我的连接,我缩小了where子句,使其指向一行。我验证了每个表中都存在该行,并且列数据在每个表中都相同。
这是我用来测试它返回单行的示例查询,
从dataset1.homework t1中选择t1。* WHERE t1.book_id = 12345 AND t1.homework_id = 10337096 AND t1.homeworkresult_id = 12353139 AND t1.question_id = 2;
从dataset2.homework t1中选择t1。* WHERE t1.book_id = 12345 AND t1.homework_id = 10337096 AND t1.homeworkresult_id = 12353139 AND t1.question_id = 2;
我验证每个返回单行,如我所料。现在,如果我加入两个表(在我的情况下,table1将拥有最多的行)。
这是我的连接语句,它返回30个ROWS,所有重复项。我不知道额外的行来自哪里或者bigquery正在做什么。因为我的表大小超过了最低8Mb压缩限制,所以需要EACH子句。
选择 T1 *。 FROM dataset1.homework AS t1 LEFT JOIN EACH dataset2.homework AS t2 ON t1.homeworkresult_id = t2.homeworkresult_id 在哪里t1.book_id = 12345 AND t1.homework_id = 10337096 AND t1.homeworkresult_id = 12353139 AND t1.question_id = 2;
如果有人能够了解到这里发生了什么,我真的很感激。
谢谢,J.D。
答案 0 :(得分:2)
所以我放弃了JOIN并从另一个角度攻击了这个问题。我使用了Google BigQuery的一个记录较少的功能,它允许您从多个查询中实际结合结果。如果要查询的表中的模式结构相同,则此方法很有效。
基本语法是,
SELECT * from(query 1),(query 2),...,(query N)
在我的例子中,查询1选择了第一个表中行数最多的所有行,查询2选择了第二个表中不在第一个表中的所有行。
J.D。