INSERTION à l'aide de la BOUCLE avec une sélection de
Je suis en train d'insérer les données d'une autre table à l'aide INSERT/SELECT combo. J'ai aussi besoin d'insérer accroissement du calcul spécifique. Cependant, je ne peux pas comprendre pourquoi il ne fonctionne pas.
J'ai la table (temp_business_area) comme ceci:
----------
| bname |
----------
| London |
| Sydney |
| Kiev |
----------
Je voudrais avoir cette enum table:
-----------------------------------------------------------------
| identifier | language_id | code | data | company_limit |
----------------------------------------------------------------|
| BUSINESS_UNIT | 0 | 100 | London | 126 |
| BUSINESS_UNIT | 0 | 200 | Sydney | 126 |
| BUSINESS_UNIT | 0 | 300 | Kiev | 126 |
-----------------------------------------------------------------
Mais ce que je reçois est: est-ce
-----------------------------------------------------------------
| identifier | language_id | code | data | company_limit |
----------------------------------------------------------------|
| BUSINESS_UNIT | 0 | 100 | London | 126 |
| BUSINESS_UNIT | 0 | 100 | Sydney | 126 |
| BUSINESS_UNIT | 0 | 100 | Kiev | 126 |
| BUSINESS_UNIT | 0 | 200 | London | 126 |
| BUSINESS_UNIT | 0 | 200 | Sydney | 126 |
| BUSINESS_UNIT | 0 | 200 | Kiev | 126 |
| BUSINESS_UNIT | 0 | 300 | London | 126 |
| BUSINESS_UNIT | 0 | 300 | Sydney | 126 |
| BUSINESS_UNIT | 0 | 300 | Kiev | 126 |
-----------------------------------------------------------------
Et voici ma boucle.
BEGIN
FOR x IN 1 .. 3 LOOP
INSERT INTO enum (identifier, language_id, code, data, company_limit)
SELECT 'BUSINESS_UNIT', 0, x*100, bname, 126 FROM temp_business_area;
END LOOP;
END;
Je ne peux pas comprendre où ai-je fait une erreur. De l'aide?
Vous avez une boucle avec trois itérations et pour chaque itération de sélectionner toutes les lignes d'une table avec trois lignes. Cela fait 9 lignes au total (3 x 3).
Je sais que dans MySQL, vous pouvez utiliser
Je sais que dans MySQL, vous pouvez utiliser
limit 20,10
pour obtenir la ligne spécifique n'est pas sûr oracle donc à la recherche comment mettre en œuvre limit
dans oracle pourrait être une allusion SELECT 'BUSINESS_UNIT', 0, x*100, bname, 126 FROM temp_business_area limit x, 1
OriginalL'auteur Jaanna | 2012-12-18
Vous devez vous connecter pour publier un commentaire.
Vous faites trois inserts pour chaque ligne dans
temp_business_area
, c'est pourquoi vous vous retrouvez avec 9 lignes.À partir de votre description de ce que vous voulez atteindre, vous n'avez pas besoin de la boucle à tous.
Il suffit d'utiliser un seul insert:
L'instruction SELECT de retour de 3 lignes, et chaque ligne est insérée dans la
enum
table. Lerow_number()
fonction retournera une incrémentation de la valeur pour chaque ligne (1,2,3) qui multplied par 100 donnera le code que vous voulez.Modifier
(d'après David commentaires):
L'utilisation de la fonction de fenêtrage n'ajoutez un peu d'un traitement à la déclaration. Si le contrôle supplémentaire sur la numérotation n'est pas nécessaire, à l'aide
ROWNUM
au lieu de cela sera un peu plus efficace (bien qu'il ne sera pas question pour seulement trois lignes).Je crois que vous auriez pu éviter une fenêtre nosort opération, et d'être moins sujettes à des erreurs de syntaxe, comme l'omission de la clause order by dans la fonction de fenêtrage (ahem) 🙂
Je ne suis pas du tout avoir la chance de lecture expliquer le plan de ... dbms_xplan sorties par le biais de sql violon ... aucune idée pourquoi pas, mais on dirait qu'il tourne en expliquer le plan à l'arrière-plan avant d'exécuter des requêtes, il est donc montrant la pickler fetch plan de la table() la fonction bla bla. Anyhoo, il ne me montrer une fenêtre nosort opération lorsque j'exécute un simple select avec l'analytique de la fonction et sélectionnez "Afficher expliquer régime". Mystère?
vous êtes de droite. Il y a un pas.
OriginalL'auteur a_horse_with_no_name
vous pouvez utiliser deux variantes d'autre:
variante 2
OriginalL'auteur Andrey Khmelev