【问题标题】:How to use Except clause in Bigquery?如何在 Bigquery 中使用 except 子句?
【发布时间】:2019-08-25 20:02:45
【问题描述】:

我正在尝试在 Bigquery 中使用现有的 Except 子句。请在下面找到我的查询

select * EXCEPT (b.hosp_id, b.person_id,c.hosp_id) from 
person a 
inner join hospital b
on a.hosp_id= b.hosp_id
inner join reading c
on a.hosp_id= c.hosp_id

如您所见,我使用了 3 张桌子。所有 3 个表都有 hosp_id 列,所以我想删除重复的列 b.hosp_idc.hosp_id。同样,我也想删除 b.person_id 列。

当我执行上述查询时,我得到如下所示的语法错误

Syntax error: Expected ")" or "," but got "." at [9:19]

请注意,我在Except 子句中使用的所有列都存在于使用的表中。附加信息是所有使用的表都是使用with 子句创建的临时表。当我通过选择感兴趣的列手动执行相同操作时,它工作正常。但我有几列,无法手动执行此操作。

你能帮忙吗?我正在尝试学习 Bigquery。您的意见会有所帮助

【问题讨论】:

    标签: sql google-bigquery bigquery-standard-sql python-bigquery


    【解决方案1】:

    我在每个表的基础上使用EXCEPT

    select p.* EXCEPT (hosp_id, person_id),
           h.*,
           r.* EXCEPT (hosp_id)
    from person p inner join
         hospital h
         on p.hosp_id = h.hosp_id inner join
         reading r
         on p.hosp_id = r.hosp_id;
    

    请注意,这也使用有意义的表别名缩写,这使得查询更易于理解。

    在您的情况下,如果您使用 USING 子句,我认为您根本不需要 EXCEPT

    【讨论】:

    • 很高兴知道这种方法。赞成。谢谢。
    【解决方案2】:

    试试这个:

    select * EXCEPT (person_id) from 
    person a 
    inner join hospital b
    using (hosp_id)
    inner join reading c
    using (hosp_id)
    

    您只能将列名(而不是路径)放在 EXCEPT 列表中,并且您可以简单地避免使用 USING 而不是 ON 来投影重复的列。

    【讨论】:

    • 您好,感谢您的回复。将尝试..Upvoted。路径,你的意思是别名吗?
    • 我尝试了不使用别名的列(例如 - 而不是 c.reading_number,我只是使用了 reading_number 并且它可以工作。bigquery 可以自动识别所提到的列的源表吗?
    • 路径我的意思是 a.b 形式的东西,名称之间有一个点。
    猜你喜欢
    • 2016-05-21
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 2022-07-06
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多