2009-01-19 62 views
0

有人可以給我看下面的語句(在Oracle 10g中有效)的MySQL等價物嗎?Oracle到MySQL的語法

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的數量決定。如果不清楚,我可以提供更多信息。

回答

2

這裏發生的主要怪事是SELECT ROWNUM FROM DUAL CONNECT BY... - 一個讓你從BOOKS.START_NUMBER的值開始遞增的數字;那些似乎被用作VOUCHER表中的主鍵。

真的,這是一個糟糕的底層數據模型的症狀:跟蹤表中的「起始數字」和「單位」 - 就像一個C數組在數據庫中變壞。

如果您花時間從Oracle遷移到MySQL,請認真考慮修復數據模型。也許你想:

  • 一個book_id列到憑證表以及後續的外鍵添加到BOOK表
  • 就在MySQL中新憑證表的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 
+0

我不認爲它是一個可怕的雜食。加入一張大桌子是擺脫關係數據集合的標準做法。 – 2009-01-20 12:45:13

0

DUAL中選擇實際上是給你一個大的臨時表加入BOOK。您允許BOOK.UNITS的值高達10,000,000。

如果單位通常比這個要低得多,那麼選擇一個選項就是創建一個虛擬表,其中包含該數量的記錄並加入到該表中,而不是DUAL構造。