2012-11-01 67 views
11

由於無法在BigQuery中更新表格中的數據,並且僅支持追加機制,因此我決定每月創建一個新表格。因此,假設2012年的表格將是(tbl_012012,tbl_022012, tbl_032012,... tbl_122012)。每條記錄將與日期timestamp一起存儲爲字符串。現在,如果我的應用程序想要獲取2012年1月(tbl_012012)到2012年3月(tbl_032012)範圍內的記錄,BigQuery API是否會通過單個SQL範圍查詢自動遍歷所需表格,還是必須編寫多個SQL查詢用額外的應用程序代碼來檢索每個查詢結果,然後將它們聚合在一起?查詢Big Query中的多個表格

回答

12

一個SQL查詢可以引用多個表。只需用FROM子句中的逗號分隔每個表即可查詢所有提到的表。

+0

非常感謝。但是,如果我的查詢搜索可能是多餘的單個記錄,那麼這將適用於範圍查詢。所以在這種情況下,Big Query顯然會遍歷每個月的表格以找到該記錄。 –

+1

BigQuery針對聚合查詢進行了優化,與查詢單個記錄的查詢相反。因此,不幸的是,在這種情況下,如果您只查找可能位於任何表格中的單個記錄,則需要搜索每個月份的表格。 –

+0

感謝您的幫助。 –

3

這裏是一個片段演示了多個表的例子選擇:

SELECT trafficSource.medium AS Traffic_Source, COUNT(trafficSource.medium) AS Counts_Source 
FROM [608XXXXX.ga_sessions_20131008], 
[608XXXXX.ga_sessions_20131009], 
[608XXXXX.ga_sessions_20131010], 
[608XXXXX.ga_sessions_20131011], 
[608XXXXX.ga_sessions_20131012], 
[608XXXXX.ga_sessions_20131013], 
[608XXXXX.ga_sessions_20131014], 
[608XXXXX.ga_sessions_20131015], 
GROUP BY Traffic_Source 
ORDER BY Counts_Source DESC 
31

您也可以使用通配符表功能。下面是來自docs爲StandardSQL一個例子:

SELECT 
    name 
FROM 
    mydata.people 
WHERE 
    age >= 35 
    AND 
    (_TABLE_SUFFIX BETWEEN '20140325' AND '20140327') 

這裏是爲LegacySQL一個類似的例子(docs)。

SELECT 
    name 
FROM 
    (TABLE_DATE_RANGE([mydata.people], 
       TIMESTAMP('2014-03-25'), 
       TIMESTAMP('2014-03-27'))) 
WHERE 
    age >= 35 

這將查詢表:

  • mydata.people20140325
  • mydata.people20140326
  • mydata.people20140327

上有docs一些其他選項。我建議檢查一下。

+0

是否可以查詢「201601」形式的月份範圍? –

1

2017年更新:

與BigQuery #standardSQL - 您可以使用標準的UNION ALL要經過多個表,或者您可以使用一個*匹配共享相同前綴的所有表。當使用*匹配器時,您還可以訪問元列_TABLE_SUFFIX - 以瞭解行來自哪個表。

SELECT * FROM Roster 
UNION ALL 
SELECT * FROM TeamMascot