2009-01-19 9 views
0

Quelqu'un peut-il me montrer l'équivalent MySQL de la déclaration suivante (qui fonctionne dans Oracle 10g)?Oracle à la syntaxe 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; 

Fondamentalement, ce que cela fait est pour chaque entrée dans la table BOOK, il fait des entrées dans la table VOUCHER. Le nombre d'entrées dans le tableau VOUCHER est déterminé par le nombre de UNITS dans la ligne correspondante du tableau BOOK. Je peux fournir plus d'informations si cela n'est pas clair.

Répondre

2

L'étrangeté principale qui se passe ici est le SELECT ROWNUM FROM DUAL CONNECT BY... - un kludge qui vous donne des numéros incrémentiels commençant à la valeur de BOOKS.START_NUMBER; ceux-ci semblent alors être utilisés comme clés primaires dans la table VOUCHER. Vraiment, c'est un symptôme d'un terrible modèle de données sous-jacent: garder la trace du "numéro de départ" et des "unités" dans une table - c'est comme un tableau C mal tourné dans une base de données.

Si vous prenez le temps de le porter d'Oracle à MySQL, pensez sérieusement à corriger le modèle de données. Peut-être que vous voulez:

  • ajouter une colonne book_id à la table VOUCHER et après clé étrangère à la table BOOK
  • faire la colonne VOUCHER_NUMBER sur la nouvelle table de voucher MySQL pour être un type auto-incrément de sorte que vous peut éliminer tout le numéro de début/unités pagaille

Avec ceux en place, utilisez la langue que vous utilisez pour mettre en œuvre la logique métier dans MySQL et mettre en œuvre ce pseudo-code:

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

Je ne le vois pas comme un kludge terrible. L'adhésion à une grande table est une pratique standard pour faire pivoter des ensembles relationnels de données. –

+0

Et l'utilisation de l'incrémentation automatique ne fonctionnerait pas ... les numéros de pièces justificatives ne sont garantis que d'être incrémentés dans un livre, mais les livres n'ont pas besoin d'être séquentiels. – Elie

+0

@Nick: peut-être pas un kludge terrible, mais néanmoins; dans quel environnement est-ce utilisé pour pivoter plutôt que la méthode cas/décodage? http://stackoverflow.com/questions/365238/advice-using-pivot-table-in-oracle – Alkini

0

La sélection de DUAL vous donne effectivement une grande table temporaire à joindre avec BOOK. Vous autorisez BOOK.UNITS à avoir des valeurs allant jusqu'à 10 000 000.

Si les unités sont généralement beaucoup plus bas que celui-ci, une option serait de créer une table fictive avec ce nombre d'enregistrements et de s'y joindre à la place de la construction DUAL.

Questions connexes