2016-04-27 8 views
2

Ich habe Tabelle T1 in Datenbank DB1 und Tabelle T2 in Datenbank DB2, haben diese Tabellen fast identische Sätze von Spalten mit Ausnahme Spalte C_additional in T1, die in T2 nicht vorhanden ist. Ich muss alle Zeilen von T2 zu T1 übertragen, einen Wert von C_additional für jede Zeile setzend, die ich einfüge. Zum Beispiel: T1 und T2 haben nur eine Spalte C1 vom Typ integer und T1 auch Spalte C_additional Typ hat text, so dass mein Code sieht wie folgt aus:PostgreSQL INSERT FROM SELECT mit zusätzlichen Spalt

INSERT INTO T1 
SELECT 
     C1, 
     C_additional='needed_value' 
FROM dblink(
    'hostaddr=127.0.0.1 port=5432 dbname=DB2 user=postgres password=postgres', 
    'SELECT * FROM T2') 
AS T2_row(C1 integer) 

Ich erhalte die folgende Fehlermeldung:

ERROR: column "C_additional" does not exist 
SQL state: 42703 
Hint: There is a column named "C_additional" in table "T1", but it cannot be referenced from this part of the query. 

Wie kann ich die Datenübertragung mit SQL durchführen, oder sollte ich PG/SQL verwenden?

+0

Zeigen Sie uns, T1 und Definitionen des t2. – jarlh

+0

'C_additional = 'needs_value'' ist ein boolescher Ausdruck, der auswertet, ob der Spaltenname' C_additional' gleich der Konstanten '' needs_value' 'ist. Wenn Sie einen Spaltenalias verwenden möchten, verwenden Sie einen: ''needs_value' als c_additional' –

Antwort

1

Sie können die Zielspalten mit Klammern angeben, bevor der select Klausel:

INSERT INTO T1 
(c1, c_additional) -- here 
SELECT 
     C1, 
     'needed_value' -- just select a constant here 
FROM dblink(
    'hostaddr=127.0.0.1 port=5432 dbname=DB2 user=postgres password=postgres', 
    'SELECT * FROM T2') 
AS T2_row(C1 integer) 
+0

Dieser arbeitete für mich, danke. – bnopne

0

Können Sie das versuchen?

INSERT INTO T1 
SELECT 
     C1, 
     'needed_value' 
FROM dblink(
    'hostaddr=127.0.0.1 port=5432 dbname=DB2 user=postgres password=postgres', 
    'SELECT * FROM T2') 
AS T2_row(C1 integer)