2012-11-01 34 views
11

Vì không thể cập nhật dữ liệu trong bảng trong BigQuery và chỉ hỗ trợ cơ chế chắp thêm, tôi đã quyết định tạo bảng mới hàng tháng. Vì vậy, giả sử cho năm 2012, các bảng sẽ là (tbl_012012, tbl_022012, tbl_032012, ... tbl_122012). Mỗi bản ghi sẽ được lưu trữ cùng với ngày timestamp dưới dạng chuỗi. Bây giờ, nếu ứng dụng của tôi muốn tìm nạp các bản ghi khác nhau, từ tháng 1 năm 2012 (tbl_012012) đến tháng 3 năm 2012 (tbl_032012), BigQuery API sẽ tự động đi qua các bảng mong muốn thông qua truy vấn SQL đơn hoặc tôi sẽ phải viết nhiều truy vấn SQL. với mã ứng dụng bổ sung để truy xuất từng kết quả truy vấn và sau đó tổng hợp chúng hoàn toàn?Truy vấn nhiều bảng trong Big Query

Trả lời

12

Một truy vấn SQL có thể tham chiếu nhiều bảng. Chỉ cần tách từng bảng bằng dấu phẩy trong mệnh đề FROM để truy vấn trên tất cả các bảng được đề cập.

+0

Cảm ơn rất nhiều vì. Nhưng điều này sẽ làm việc trong trường hợp truy vấn phạm vi, nếu truy vấn của tôi tìm kiếm một bản ghi có thể dư thừa. Vì vậy, trong trường hợp này, Big Query sẽ hiển thị ngang qua bảng mỗi tháng để tìm bản ghi đó. –

+1

BigQuery được tối ưu hóa cho truy vấn tổng hợp, thay vì truy vấn đang tìm kiếm một bản ghi. Vì vậy, có, thật không may trong trường hợp này bạn sẽ cần phải tìm kiếm thông qua mỗi bảng tháng nếu bạn đang tìm kiếm chỉ là một hồ sơ duy nhất mà có thể được trong bất kỳ bảng. –

+0

Cảm ơn vì đã giúp tôi. –

3

Dưới đây là một đoạn trích thể hiện một ví dụ về bảng nhiều chọn:

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

Bạn cũng có thể sử dụng một chức năng Bảng ký tự đại diện. Dưới đây là một ví dụ từ số docs cho StandardSQL:

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

Và đây là ví dụ tương tự cho LegacySQL (docs).

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

này sẽ truy vấn các bảng:

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

Có một vài tùy chọn khác trên docs. Tôi khuyên bạn nên kiểm tra chúng.

+0

Có thể truy vấn một phạm vi tháng của biểu mẫu '201601' không? –

1

2017 update:

Với BigQuery #standardSQL - bạn có thể sử dụng tiêu chuẩn UNION ALL phải đi qua nhiều bảng, hoặc bạn có thể sử dụng một * để phù hợp với tất cả các bảng chia sẻ tiền tố giống nhau. Khi sử dụng đối sánh *, bạn cũng sẽ có quyền truy cập vào cột meta _TABLE_SUFFIX - để biết bảng nào đến từ hàng nào.

SELECT * FROM Roster 
UNION ALL 
SELECT * FROM TeamMascot 
Các vấn đề liên quan