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

nor*_*tos 2 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')
Run Code Online (Sandbox Code Playgroud)

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

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')
Run Code Online (Sandbox Code Playgroud)

它不起作用,我收到此错误消息:

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

我相信谷歌应该有办法做到这一点.

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

Mos*_*sky 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'))
Run Code Online (Sandbox Code Playgroud)

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