2017-06-21 2 views
0

Je dois donc trouver comment insérer dans une table, à partir d'une autre table, avec une clause where qui me demande d'accéder à la table que j'insère dans . J'ai essayé un alias de la table dans laquelle je l'insère, mais j'ai rapidement découvert que vous ne pouvez pas faire cela. Fondamentalement, ce que je veux vérifier, c'est que les valeurs que j'insère dans la table correspondent à un champ particulier de la table dans laquelle j'insère. Voici ce que j'ai essayé:Insérer avec select, en fonction des valeurs de la table d'insertion dans EDITED

INSERT INTO "USER"."TABLE1" AS A1 
SELECT * 
FROM "USER"."TABLE2" AS A2 
WHERE A2."HIERARCHYLEVEL" = 2 
AND A2."PARENT" = A1."INSTANCE" 

Évidemment, cela n'a servi à rien. J'ai déjà essayé quelques autres requêtes, mais elles ne m'ont nulle part non plus. Toute aide serait très appréciée.

EDIT: Je souhaite ajouter des lignes à cette table, sans ajouter de colonnes à la table. Les deux tables ont exactement la même structure - en fait, j'ai extrait les données déjà dans table1 de table2. Ce que j'ai dans la table 1 actuellement, c'est un tas d'enregistrements qui n'ont AUCUN PARENT, mais une instance. Ce que je veux ajouter, c'est tous les enregistrements qui ont un parent dans la table2 qui sont égaux à l'instance dans le tableau 1.

+0

Pourquoi ne pas utiliser un JOIN pour trouver les lignes dont vous avez besoin? – danielsepulvedab

+0

Vous devez avoir une sorte de lien/jointure et une restriction sur A1 dans votre sous-requête. Si la sous-requête ne fonctionne pas seule (en tant que requête de niveau supérieur), corrigez-la en premier. – vwegert

+0

@danielsepulvedab S'il vous plaît élaborer ... Je ne suis pas sûr de comprendre. Essayez-vous de dire quelque chose comme: SELECT * FROM (TABLE1 INNER JOIN TABLE2 SUR TABLE1.INSTANCE = TABLE2.PARENT)? –

Répondre

-1

Cela m'a donné la réponse que je cherchais, même si je suis sûr qu'il y a un plus facile - ou plus efficace - façon de le faire.

INSERT INTO "user"."table1" 
SELECT 
    A1."ROOT", 
    A1."INSTANCE", 
    A1."PARENT", 
    A1."HIERARCHYLEVEL" 
FROM "user"."table2" AS A1, 
    "user"."table1" AS A2 
WHERE A1."INSTANCE" = A2."PARENT" 
AND A2."HIERARCHYLEVEL" = 2 
0

Actuellement, il n'y a aucun moyen de se joindre à une table lors de l'insertion. La solution avec la sous-sélection où vous sélectionnez dans la table est la bonne. L'aliasing de la table que vous souhaitez modifier n'est possible qu'avec UPDATE, UPSERT et MERGE. Pour ces opérations, cela a du sens, car vous devez faire correspondre une colonne et ensuite décider si vous devez la mettre à jour ou insérer quelque chose à la place. Dans votre exemple, la ligne de table1 que vous associez n'est pas pertinente, car vous ne voulez pas la modifier, donc du point de vue de la déclaration, il n'est pas vraiment pertinent que la table que vous utilisez dans votre sous-sélection soit la même vous insérez dans.

Comme solution de rechange, je peux vous suggérer de solution suivante, ce qui équivaut à la vôtre:

INSERT INTO "user"."table1" 
SELECT 
    A1."ROOT", 
    A1."INSTANCE", 
    A1."PARENT", 
    A1."HIERARCHYLEVEL" 
FROM "user"."table2" AS A1 
WHERE A1."INSTANCE" in (select "PARENT" from "user"."table1") 
AND A2."HIERARCHYLEVEL" = 2