【问题标题】:BigQuery - "for loop like" operations to help mass insert rows to a tableBigQuery - “for loop like”操作,以帮助将行批量插入到表中
【发布时间】:2020-11-26 23:22:28
【问题描述】:

我有一个简单的菜单表,其中描述了不同大小的不同菜肴的价格。三栏,菜名、菜大小和价格。对于每道菜,我有 S、M 和 L 三种尺寸。

问题在于,目前表中并非所有菜肴都有所有三种尺寸的价格,我们正计划在菜单表中添加更多菜肴。所以最后我希望菜单上有所有三种尺寸的所有现有和新菜肴的价格。我想先把所有新菜都加进去,然后循环遍历桌子上的所有菜,对于那些没有价格的尺寸,输入默认价格。但我没有找到一种方法来执行 for 循环和 if 检查使用大查询。不知道 sql 是否支持,我们有什么解决方案可以实现吗?

所有菜品的默认价格: S - $6, M - $8, L - $9

当前表:

Dish.         size.         price.
fried rice    S             $6
fried rice    L             $8.5
pancake       S             $5
pancake       M             $7    
pancake       L             $9
corn soup     S             $6
corn soup     M             $8
corn soup     L             $9
salad         M             $6.5
salad         S             $4
snack mix     M             $6

【问题讨论】:

    标签: sql google-bigquery subquery sql-insert


    【解决方案1】:

    不要循环! SQL 是一种基于集合的语言,它提供了通过一条语句解决此问题所需的所有工具。

    您可以cross join 具有固定尺寸列表(以及它们的默认价格)的不同菜肴列表,过滤掉已经存在的元组not existsinsert 表中的结果:

    insert into mytable (dish, size, price)
    select d.dish, s.size, s.price
    from (select distinct dish from mytable) d
    cross join (
        select 'S' size, 6 price
        union all select 'M', 8
        union all select 'L', 9
    ) s
    where not exists (select 1 from mytable t1 where t1.dish = d.dish and t1.size = s.size)
    

    【讨论】:

    • 酷,这很神奇!!!多谢。只是想知道,如果我已经把我所有的新菜放在另一个表中,并且没有将这些新菜的名称添加到 mytable 中,我们可以通过修改上面的查询来达到同样的目的吗?
    猜你喜欢
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    相关资源
    最近更新 更多