【问题标题】:How to translate syntax from SQL Server to Postgresql?如何将语法从 SQL Server 转换为 Postgresql?
【发布时间】:2017-09-14 07:36:26
【问题描述】:

我正在从使用 SQL Server 迁移到 Postgresql,但在删除变量时遇到了问题。

在 SQL Server 中我写了这样的东西,效果很好:

    --Compute the probabilities for unique users 
    declare @users_total decimal(18,2)
    select @users_total=count(*) from unique_users_table 
    select column1, uvs, uvs/@users_totalm as puvs
    into probabilities_table 
    from column_uniquevisits_table 

我试图像这样将它翻译成 Postgresql,但出现错误:

    --Compute the probabilities for unique users  
    declare users_total numeric(18,2);
    select users_total=count(*)  
    from unique_users_table
    select coumn1, uvs, uvs/users_total as puvs 
    insert into probabilitiestable
    from column_uniquevisits_table

在 Postgresql 中编写我最初在 SQL Server 中的内容的正确方法是什么?

【问题讨论】:

标签: sql sql-server database postgresql


【解决方案1】:

如果要基于选择创建表,请使用create table as select。

不需要声明(无论如何不能在 PL/pgSQL 函数之外使用)

create table probabilitiestable
as
select column1, 
       uvs, 
       uvs::numeric/(select count(*) from count(*) from unique_users_table) as puvs 
from column_uniquevisits_table;

强制转换::numeric 是必要的,否则除法将使用整数算术完成,这意味着您不会得到任何小数值。如果uvs 已经定义为numeric(或decimal 或float),那么您不需要它。

【讨论】:

    【解决方案2】:

    我会使用交叉连接来创建计数,以避免上下文切换并避免对 unique_users_table 进行多次查询。我们可以使用交叉连接的原因是因为我们知道查询的结果将始终是 1 条记录。因此它不会对结果产生乘法效应。

    CREATE table probabilitiestable as 
    SELECT column1, uvs, uvs/ut.users_total as puvs
    FROM column_uniquevisits_table 
    CROSS JOIN (SELECT count(*) as users_total 
                FROM unique_users_Table) ut
    

    【讨论】:

    • Postgres 优化器不会为每一行运行一次标量子选择。只做一次就足够聪明了。
    • 我概括的太多了。我知道在某些引擎上,它们不够聪明,无法做到这一点。很高兴知道。对于那些不够聪明的引擎,只是习惯的力量在“FROM”中这样做!
    猜你喜欢
    • 2017-01-13
    • 2022-07-02
    • 2016-01-22
    • 1970-01-01
    • 2013-04-19
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    相关资源
    最近更新 更多