首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle to MySQL语法

Oracle to MySQL语法
EN

Stack Overflow用户
提问于 2009-01-19 01:51:45
回答 2查看 1.1K关注 0票数 0

谁能给我展示一下以下语句的MySQL等价物(适用于Oracle10g)?

代码语言:javascript
复制
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数确定。如果这一点不清楚,我可以提供更多信息。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-01-20 04:37:56

这里最奇怪的是SELECT ROWNUM FROM DUAL CONNECT BY... --它给出的是从BOOKS.START_NUMBER值开始递增的数字;然后这些数字似乎被用作凭证表中的主键。

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

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

  • 将book_id列添加到凭证表中,并将后续的外键添加到BOOK表中
  • 使MySQL中新凭证表上的VOUCHER_NUMBER列成为自动增量类型,这样您就可以消除整个起始编号/单位mess

准备就绪后,使用您正在使用的任何语言在MySQL中实现业务逻辑,并实现以下伪代码:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2009-01-19 10:16:46

select from DUAL实际上为您提供了一个与BOOK连接的大型临时表。您允许BOOK.UNITS的值最高可达10,000,000。

如果单位数通常要低得多,那么可以选择创建一个包含该数量记录的虚拟表,并将其连接到该表而不是DUAL结构。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/456321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档