2017-09-25 107 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