谁能给我展示一下以下语句的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中创建条目。VOUCHER表中的条目数由BOOK表中相应行中的UNITS数确定。如果这一点不清楚,我可以提供更多信息。
发布于 2009-01-20 04:37:56
这里最奇怪的是SELECT ROWNUM FROM DUAL CONNECT BY... --它给出的是从BOOKS.START_NUMBER值开始递增的数字;然后这些数字似乎被用作凭证表中的主键。
实际上,这是一个糟糕的底层数据模型的症状:跟踪表中的“起始号”和“单位”--这就像数据库中的C数组出了问题。
如果您正在花时间将其从Oracle移植到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发布于 2009-01-19 10:16:46
select from DUAL实际上为您提供了一个与BOOK连接的大型临时表。您允许BOOK.UNITS的值最高可达10,000,000。
如果单位数通常要低得多,那么可以选择创建一个包含该数量记录的虚拟表,并将其连接到该表而不是DUAL结构。
https://stackoverflow.com/questions/456321
复制相似问题