mysql - Oracle 到 MySQL 的语法

标签 mysql oracle syntax

有人可以向我展示与以下语句等效的 MySQL(适用于 Oracle 10g)吗?

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 中创建条目。 VOUCHER 表中的条目数由 BOOK 表中相应行中的 UNITS 数确定。如果不清楚,我可以提供更多信息。

最佳答案

这里发生的主要怪异之处是SELECT ROWNUM FROM DUAL CONNECT BY...——这是一个从 BOOKS.START_NUMBER 的值开始递增的数字的组合;这些似乎被用作 VOUCHER 表中的主键。

确实,这是一个糟糕的底层数据模型的症状:跟踪表中的“起始编号”和“单位”——就像数据库中的 C 数组出了问题。

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

  • 向 VOUCHER 表添加 book_id 列,并向 BOOK 表添加后续外键
  • 将 MySQL 中新 VOUCHER 表的 VOUCHER_NUMBER 列设置为自动增量类型,这样就可以消除整个起始编号/单位的困惑

完成这些后,使用您正在使用的任何语言在 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

关于mysql - Oracle 到 MySQL 的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/456321/

相关文章:

php - "Training mode"使用 PDO 和 MySQL

mysql - 从连接表中选择子集通用的不同集

oracle - 使用 docker-compose 安装 Oracle 数据库

syntax - 当 foo 被声明为可变时,要求 &mut foo 而不是 &foo 的原因是什么?

php - 将数据(动态结果)拆分为 3 列 - php mysql

php - 如何通过特定id计算评论总数

sql - 如何将 GROUPING 值从 0/1 更改为 no/yes?

sql - 错误 49 错误的绑定(bind)变量 oracle 表单

arrays - `${1#*=}` 在 Bash 中意味着什么?

Scala 方法引用另一个类?