Синтаксис Oracle в MySQL - PullRequest
       14

Синтаксис Oracle в MySQL

0 голосов
/ 19 января 2009

Может ли кто-нибудь показать мне эквивалент 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 определяется числом UNITS в соответствующей строке таблицы BOOK. Я могу предоставить больше информации, если это неясно.

Ответы [ 2 ]

2 голосов
/ 20 января 2009

Основная странность, происходящая здесь, это SELECT ROWNUM FROM DUAL CONNECT BY... - клудж, который дает вам увеличивающиеся числа, начиная со значения BOOKS.START_NUMBER; тогда они, кажется, используются в качестве первичных ключей в таблице VOUCHER.

Действительно, это признак ужасной базовой модели данных: отслеживание «начального числа» и «единиц» в таблице - это похоже на массив C, испорченный в базе данных.

Если вы тратите время на перенос этого с Oracle на MySQL, серьезно подумайте над исправлением модели данных. Возможно, вы хотите:

  • добавить столбец book_id в таблицу VOUCHER и последующий внешний ключ в таблицу BOOK
  • сделать столбец VOUCHER_NUMBER в новой таблице VOUCHER в 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
0 голосов
/ 19 января 2009

Выбор из DUAL фактически дает вам большую временную таблицу для объединения с BOOK. Вы разрешаете BOOK.UNITS иметь значения до 10 000 000.

Если единицы измерения обычно намного ниже, чем этот вариант, можно создать фиктивную таблицу с таким количеством записей и присоединиться к ней вместо конструкции DUAL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...