有人可以向我展示与以下语句等效的 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/