2013-01-05 59 views
2

我有一些記錄有關於商店的信息。這些記錄有幾個不同的嵌套字段。其中一個嵌套字段是標籤,一個是員工。我試圖計算具有特定名稱的標籤和僱員的商店數量。所以我這樣做:在BigQuery中使用多個嵌套字段

SELECT count(*) 
FROM [stores.stores_844_1] 
where tags.tag_name='foo' 
and employees.first_name='bar' 

然後我得到的錯誤:

Error: Cannot query the cross product of repeated fields tags.tag_name and employees.first_name

我可以把它通過改變查詢工作:

SELECT count(*) 
FROM ((flatten([stores.stores_844_1],tags)) 
where tags.tag_name='foo' 
and employees.first_name='bar' 

的問題,這是我動態創建其中條款,所以我的條款將根據改變我在裏有什麼。雖然我可以生成代碼的一些邏輯弄清楚從子句應該是什麼,我不知道是否有一種方法可以這樣做:

SELECT count(*) 
FROM [stores.stores_844_1] 
where tags.tag_name='foo' WITHIN RECORD 
and employees.first_name='bar' WITHIN RECORD 

這不會有變平主表? 我一直在使用一個醜陋的解決辦法是這樣的嘗試:

SELECT count(*) 
FROM 
(SELECT GROUP_CONCAT(CONCAT('>', tags.tag_name,'<')) WITHIN RECORD as f1, GROUP_CONCAT(CONCAT('>',employees.first_name,'<')) WITHIN RECORD as f2 
FROM [stores.stores_844_1] 
) 
where f1 CONTAINS '>foo<' 
and f2 CONTAINS '>bar<' 

這個醜陋的變通辦法我怎麼想它,但它只是似乎真的哈克和醜陋,必須有一個更好的辦法,對不對?

回答

2

您可以使用WITHIN RECORD來提出另一個字段,指示值是否存在。我不確定這是否符合您的要求,因爲您仍然必須更改FROM子句,但它看起來比您當前所做的更清晰。如果我將它移動到外where子句雖然has_foo` 它的工作原理:換句話說,試試這個:

SELECT count(*) FROM (
    SELECT SUM(IF(tags.tag_name='foo', 1, 0)) WITHIN RECORD as has_foo, 
      SUM(IF(employees.first_name='bar', 1, 0)) WITHIN RECORD as has_bar, 
    FROM [stores.stores_844_1]) 
    WHERE has_foo > 0 AND has_bar > 0 
+0

不幸的是,當我嘗試這樣做,我得到的錯誤: '未知的領域。我認爲使用SUM絕對看起來好像比使用group_concat更高效,所以我會切換到使用它。理想情況下,將會有一種方法可以實現,所以只有子選擇的WHERE子句受到影響,並且您不必對SELECT子句做任何事情。 –

+0

我已經更新了我的迴應,將where子句中的parens移動到了裏面。我不確定有沒有辦法做到這一點,而不修改外部where子句(不添加另一個嵌套選擇)。 –