左外连接还是where语句?

时间:2015-07-29 20:48:56

标签: google-bigquery

我有一个查询,它给出了同一日期四个不同表中的记录总数。我为五个相关项目筛选它们并排除一种类型。

SELECT
COUNT (*) AS table_total_filtered
FROM
db.table_1_20150727,
db.table_2_20150727,
db.table_3_20150727,
db.table_4_20150727
WHERE
item LIKE "A" OR item LIKE "B" OR item LIKE "C"
OR item LIKE "D" OR item LIKE "E" AND
type NOT LIKE "Z"    

我有第二个查询,它给了我第二个表中的行数。数据可能存在时区差异,因此我将目标日拉为中间日期三天。

SELECT
COUNT (*) AS table_2_total
FROM
db2.table_20150726,
db2.table__20150727,
db2.table__20150728

这两个表有一个共同的字段。公共字段在每个表中具有不同的名称。该字段在table_1,table_2,table_3和table_4中称为ID1。它在表中称为ID2。我想获取第二个查询的结果,然后计算ID在两者之间匹配的次数。

SELECT
COUNT (*) AS overlap
FROM
db.table_1_20150727,
db.table_2_20150727,
db.table_3_20150727,
db.table_4_20150727,
db2.table_20150726,
db2.table__20150727,
db2.table__20150728
WHERE
item LIKE "A" OR item LIKE "B" OR item LIKE "C"
OR item LIKE "D" OR item LIKE "E" AND
type NOT LIKE "Z" AND
ID1 = ID2

据我了解,此查询无法正常工作,因为第一步需要计算第一个表并尝试计算不存在的ID2。使用表名限定字段似乎也不起作用,因为文本不会变为蓝色。我认为在这一点上排位不是我的问题,我需要做的是将第一个查询的结果与第二个查询的结果左联接,然后计算ID1 = ID2的位置?

非常感谢有关如何编写/接近相应语句以加入这两个查询以及计算ID1与ID2匹配的记录数量的任何帮助!

谢谢!

1 个答案:

答案 0 :(得分:0)

听起来你想要一个非常简单的JOIN,每个初始查询都是来源:

SELECT
  COUNT(*) as overlap
FROM (
  SELECT
    ID1
  FROM
    db.table_1_20150727,
    db.table_2_20150727,
    db.table_3_20150727,
    db.table_4_20150727
  WHERE
    item LIKE "A" OR item LIKE "B" OR item LIKE "C"
    OR item LIKE "D" OR item LIKE "E" AND
    type NOT LIKE "Z") AS table_1
JOIN (
  SELECT
    ID2
  FROM
    db2.table_20150726,
    db2.table__20150727,
    db2.table__20150728) as table_2
ON table_1.ID1 = table_2.ID2

请注意,在很多SQL系统中,逗号表示JOIN,但in BigQuery, the comma actually represents a union

  

注意:与许多其他基于SQL的系统不同,BigQuery使用逗号语法来指示表联合,而不是联接。

这可能就是为什么您上面发布的查询没有做您期望的事情。