代码之家  ›  专栏  ›  技术社区  ›  Elie

Oracle到MySQL语法

  •  0
  • Elie  · 技术社区  · 15 年前

    有人能给我看一下mysql中等价于以下语句的语句吗(在Oracle10g中有效)?

    INSERT INTO VOUCHER (VOUCHER_NUMBER, BOOK_ID, DENOMINATION) 
      SELECT a.a1, b.ID, b.DENOMINATION FROM (SELECT rownum a1 
                                                FROM dual 
                                          CONNECT BY rownum <= 10000000) a, BOOK b
      WHERE a.a1 BETWEEN b.START_NUMBER AND b.START_NUMBER + b.UNITS - 1;
    

    基本上,这是为表中的每个条目所做的 BOOK ,它正在表中进行输入 VOUCHER . 中的条目数 凭单 表由 UNITS 在相应的行中 表。如果不清楚的话,我可以提供更多的信息。

    2 回复  |  直到 8 年前
        1
  •  2
  •   Alkini    15 年前

    这里发生的主要怪事是 SELECT ROWNUM FROM DUAL CONNECT BY... --从books.start_number的值开始递增数字的组合;然后这些数字似乎被用作凭证表中的主键。

    实际上,这是一个糟糕的底层数据模型的症状:跟踪表中的“起始数字”和“单位”——就像数据库中的C数组坏了一样。

    如果您要花时间将它从Oracle移植到MySQL,请认真考虑修复数据模型。也许你想:

    • 在凭证表中添加book_id列,并在book表中添加后续的外键。
    • 在MySQL中,将新凭证表中的凭证号列设置为自动递增类型,这样可以消除整个起始编号/单位混乱。

    有了这些工具,就可以使用任何语言来实现MySQL中的业务逻辑,并实现这个伪代码:

    for 1 to BOOK.units loop
    
      INSERT INTO VOUCHER (
          -- VOUCHER_NUMBER handled by auto-increment
          BOOK_ID
        , DENOMINATION
      )
      SELECT 
          b.ID
        , b.DENOMINATION
      FROM BOOK b
      WHERE b.ID = [book ID];
    
    end loop
    
        2
  •  0
  •   Nick Pierpoint    15 年前

    从中选择 DUAL 有效地为您提供了一个大型临时表 BOOK . 你允许 BOOK.UNITS 最大值为10000000。

    如果单位通常比这个低很多,那么一个选项是创建一个包含该数量记录的虚拟表,并连接到该表,而不是 二重的 构建。