开发者社区 > 大数据与机器学习 > 实时数仓 Hologres > 正文

Hologres 这个语法在mysql会报错。但是pg这个就直接过了。 这算不算bug?

Hologres delete from public.cnpldw_dct_waybill_trace_f_1
where exists (select 1 from public.cnpldw_dct_waybill_trace_f_1_tmp b where bill_id=b.bill_id and status=b.status); 我执行的是这个语句,结果把主表全清了。tmp表里面就6万,主表2个亿,我看了逻辑是没问题的。唯一的问题是exists里面没有给主表加个别名。导致主表全清了。这个语法在mysql会报错。但是pg这个就直接过了。 这算不算bug?

展开
收起
cuicuicuic 2023-12-18 08:06:05 28 0
2 条回答
写回答
取消 提交回答
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    这个语法在MySQL中会报错,因为MySQL不支持在EXISTS子句中使用表的别名。但是,在PostgreSQL中,这个语法是允许的,所以您在Hologres上执行这个语句时没有遇到问题。

    如果您希望在MySQL中实现类似的功能,可以使用以下方法:

    1. 使用临时表存储主表和tmp表的数据。
    2. 在临时表中删除与tmp表中相同的数据。
    3. 将临时表中的数据插入回主表。
    4. 删除临时表。

    以下是相应的MySQL代码示例:

    -- 创建临时表并插入数据
    CREATE TEMPORARY TABLE temp_table AS
    SELECT * FROM public.cnpldw_dct_waybill_trace_f_1;
    
    -- 删除与tmp表中相同的数据
    DELETE t
    FROM temp_table t
    JOIN public.cnpldw_dct_waybill_trace_f_1_tmp b ON t.bill_id = b.bill_id AND t.status = b.status;
    
    -- 将临时表中的数据插入回主表
    INSERT INTO public.cnpldw_dct_waybill_trace_f_1
    SELECT * FROM temp_table;
    
    -- 删除临时表
    DROP TEMPORARY TABLE temp_table;
    
    2023-12-18 14:43:35
    赞同 展开评论 打赏
  • 这个sql不写别名也是正常的语法,不会报错。问题应该是你join了多少主表的数据然后就被删除了。 ,此回答整理自钉群“实时数仓Hologres交流群”

    2023-12-18 11:18:15
    赞同 展开评论 打赏

本技术圈将为大家分析有关阿里云产品Hologres的最新产品动态、技术解读等,也欢迎大家加入钉钉群--实时数仓Hologres交流群32314975

相关产品

  • 实时数仓 Hologres
  • 相关电子书

    更多
    搭建电商项目架构连接MySQL 立即下载
    搭建4层电商项目架构,实战连接MySQL 立即下载
    PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

    相关镜像