2017-09-25 112 views
0

There are two tables(Table A and Table B) with same schema交叉相乘的兩個表顯示有使用的BigQuery

我想乘TableA.ColumnB * TableB.ColumnB等相同的架構。我可以通過連接兩個表的每一列乘以如下圖所示

select TableA, 
     (TableA.ColumnB*TableB.ColumnB) as Column B, 
     (TableA.ColumnC*TableB.ColumnC) as Column C 
from Table A 
    join Table B on TableA.ColumnA = TableB.ColumnA 

由於有需要成倍增加,我在尋找一些簡單的方法使用大的查詢做很多列做到這一點,以後。像表A *表B(這樣兩個表相同的列乘上)

感謝

+1

你實際使用哪個dbms? – jarlh

+2

你的方法對我來說似乎很簡單。 –

+0

@jarlh我使用BigQuery作爲谷歌雲平臺。 – Harish

回答

1

有沒有像表A * B表什麼簡單的辦法?
不爲我所知道的BigQuery

我的建議是建立實用查詢,將與所有100S柱爲您創建正確的查詢涉及
當然,這可以用任何工具可以輕鬆完成,但如果你想留內的BigQuery - 下面是BigQuery的標準SQL

選擇它建立您的查詢的一部分,你需要爭取所有

(TableA.ColumnX * TableB.Column XB)爲X列,

#standardSQL 
SELECT 
    CONCAT(
    'SELECT a.ColumnA AS ColumnA, \n', 
    STRING_AGG(CONCAT(
     '\ta.', SPLIT(kv_a, ':')[SAFE_OFFSET(0)], ' * ', 
     'b.', SPLIT(kv_b, ':')[SAFE_OFFSET(0)], 
     ' AS ', SPLIT(kv_a, ':')[SAFE_OFFSET(0)]), 
     ' , \n'), ' \n', 
    'FROM TableA a JOIN TableB b ON a.ColumnA = b.ColumnA' 
) AS query_string 
FROM (
    SELECT 
    1 AS grp, 
    SPLIT(REGEXP_REPLACE(TO_JSON_STRING(a), '["{}]', '')) AS kvs_a, 
    SPLIT(REGEXP_REPLACE(TO_JSON_STRING(b), '["{}]', '')) AS kvs_b 
    FROM (SELECT * FROM TableA LIMIT 1) a 
    JOIN TableB b 
    ON a.ColumnA = b.ColumnA 
    LIMIT 1 
) 
CROSS JOIN UNNEST(kvs_a) kv_a WITH OFFSET pos_a 
CROSS JOIN UNNEST(kvs_b) kv_b WITH OFFSET pos_b 
WHERE pos_a = pos_b AND pos_a > 0 
GROUP BY grp 

,如果你的「環境」方面\ n和\ t - 您將在下面得到的結果(假設表三列在你的問題 - 但它會工作的完全相同100列)

query_string 
------------ 
SELECT a.ColumnA AS ColumnA, 
    a.ColumnB * b.ColumnB AS ColumnB , 
    a.ColumnC * b.ColumnC AS ColumnC 
FROM TableA a JOIN TableB b ON a.ColumnA = b.ColumnA  

所以,現在你可以複製實用查詢的結果,並運行它作爲您的最終查詢

正如你可能注意到了 - 這種方法是基於列的位置,但如果你有相同的列兩個表中的名稱 - 您可以通過刪除連接來簡化實用程序查詢 - 到som像下面這樣

#standardSQL 
SELECT 
    CONCAT(
    'SELECT a.ColumnA AS ColumnA, \n', 
    STRING_AGG(CONCAT(
     '\ta.', SPLIT(kv_a, ':')[SAFE_OFFSET(0)], ' * ', 
     'b.', SPLIT(kv_a, ':')[SAFE_OFFSET(0)], 
     ' AS ', SPLIT(kv_a, ':')[SAFE_OFFSET(0)]), 
     ' , \n'), ' \n', 
    'FROM TableA a JOIN TableB b ON a.ColumnA = b.ColumnA' 
) AS query_string 
FROM (
    SELECT 
    1 AS grp, 
    SPLIT(REGEXP_REPLACE(TO_JSON_STRING(a), '["{}]', '')) AS kvs_a 
    FROM (SELECT * FROM TableA LIMIT 1) a 
) 
CROSS JOIN UNNEST(kvs_a) kv_a WITH OFFSET pos_a 
WHERE pos_a > 0 
GROUP BY grp