半连接表达式必须是逻辑AND的一部分

时间:2015-07-20 21:51:54

标签: google-bigquery

我有一个表(我们可以称之为" A"),其中包含一些字段(模型:字符串,年龄:整数,代码1:整数,代码2:整数,代码3:整数)和另一个表(它可以是"代码")分类代码(代码:整数,代码类型:字符串,描述:字符串)。

该字段代码类型用于分组代码。例如,200到300之间的代码是棕色的。每个项目最多可以包含3个代码。

现在,我只想获得简单,简单的查询:

SELECT model,age FROM dataset.A
WHERE code1 IN (SELECT code FROM dataset.codes WHERE codetype='brown')

并且它有效,除了事实,还有另外两个。所以,如果我这样做:

SELECT model,age FROM dataset.A
WHERE code1 IN (SELECT code FROM dataset.codes WHERE codetype='brown')
OR code2 IN (SELECT code FROM dataset.codes WHERE codetype='brown')
OR code3 IN (SELECT code FROM dataset.codes WHERE codetype='brown')

它没有工作,我收到此错误消息:

Error: (xx:yy): Semijoin expression (i.e. "x IN (SELECT ...)") must be a part of logical AND.

我相信Google应该有办法做到这一点。

顺便说一下,我正在开发的项目不是" A"和"代码"。我真的需要一个解决方案。谢谢你的帮助。

2 个答案:

答案 0 :(得分:7)

BigQuery目前确实存在IN子查询必须与AND连接的限制。作为一种解决方法,您可以单独执行每个SELECT,然后UNION结果,即

SELECT model, age FROM
(SELECT model,age FROM dataset.A
WHERE code1 IN (SELECT code FROM dataset.codes WHERE codetype='brown')),
(SELECT model,age FROM dataset.A
WHERE code2 IN (SELECT code FROM dataset.codes WHERE codetype='brown')),
(SELECT model,age FROM dataset.A
WHERE code3 IN (SELECT code FROM dataset.codes WHERE codetype='brown'))

这可能导致(模型,年龄)对的重复,因此如果不需要,您可以使用GROUP BY model, age

删除重复项

答案 1 :(得分:1)

如果您在半连接中选择的元素数量很少,则将其冷却为两个查询:第一个将获得您要查找的值,第二个将计算半连接(对semijoins的限制仅在IN子句是子选择时,而不是在具体列表时)。也就是说,先做

SELECT code FROM dataset.codes WHERE codetype='brown'

让我们说结果是'foo', 'bar', 'baz'

然后你可以这样做:

SELECT model,age FROM dataset.A
WHERE code1 IN ('foo', 'bar', 'baz')
  OR code2 IN ('foo', 'bar', 'baz')
  OR code3 IN ('foo', 'bar', 'baz')

这不是一个很好的解决方案,但它可能是一个合理的解决方法。