2015-07-20 60 views
2

我有一個表(我們可以稱它爲「A」),其中有一些字段(型號:字符串,年齡:整數,code1:整數,code2:整數,code3:整數)和用分類代碼(代碼:整數,代碼類型:字符串,描述:字符串)的另一個表(它可以是「代碼」)。Semijoin表達式必須是邏輯的一部分AND

該字段代碼類型是爲了組代碼。例如,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. 

我相信谷歌應該有辦法做到這一點。

順便說一句,我正在開發的項目不是用「A」和「代碼」。我真的需要一個解決方案。感謝任何幫助。

回答

7

BigQuery確實目前有限制,即IN子查詢必須連接AND。作爲一種變通方法,可以執行每個單獨選擇,然後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

+0

我真的很感謝你的回答。情況是,這是虛擬用戶的查詢生成器。這種變化意味着一個大的變化。你有沒有想過在這種限制的方式上是否有解決方案? – norgematos

1

如果您在半連接中選擇的元素數量很少,您可以將它分解爲兩個查詢:第一個將獲得您要查找的值,第二個將計算semijoin(限制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') 

這是不是一個漂亮的解決方案,但它可能是一個合理的解決方法。