Frage

Ich habe eine große Abfrage, die in einer PostgreSQL-Datenbank.Die Abfrage ist so etwas wie dieses:

SELECT * FROM table1, table2, ... WHERE table1.id = table2.id...

Wenn ich diese Abfrage als sql-Abfrage, die es gibt die gewünschte Zeile.

Aber wenn ich versucht, die gleiche Abfrage eine Ansicht erstellt haben, gibt es einen Fehler:

"Fehler:Spalte "id" angegeben, mehr als einmal."

(Ich verwenden Sie pgAdminIII, bei der Ausführung der Abfragen.)

Werde ich denke, dies geschieht, weil die Ergebnismenge, die mehr als eine Spalte mit dem Namen "id".Ist es irgendwie um dies zu lösen, ohne das schreiben die Namen der Spalten in der Abfrage?

War es hilfreich?

Lösung

Das geschieht, weil eine Ansicht zwei id benannten Spalten haben würde, einen von table1 und einen aus table2, wegen der select *.

Sie müssen angeben, welche id Sie in der Ansicht möchten.

SELECT table1.id, column2, column3, ... FROM table1, table2 
WHERE table1.id = table2.id

Die Abfrage funktioniert, weil es gleichermaßen Spalten genannt hat ...

postgres=# select 1 as a, 2 as a;
 a | a
---+---
 1 | 2
(1 row)

postgres=# create view foobar as select 1 as a, 2 as a;
ERROR:  column "a" duplicated
postgres=# create view foobar as select 1 as a, 2 as b;
CREATE VIEW

Andere Tipps

Wenn nur Joinspalten dupliziert werden (das heißt die gleichen Namen), dann können Sie weg mit Wechsel:

select *
from a, b
where a.id = b.id

zu:

select *
from a join b using (id)

Wenn Sie hier sind, weil Sie versuchen, eine Funktion wie to_date und dass das "mehr als einmal definiert" - Fehler, Hinweis, dass Sie brauchen, um eine Spalte alias für Funktionen, z.B.:

to_date(o.publication_date, 'DD/MM/YYYY') AS publication_date

Nein integrierte Möglichkeit, in der Sprache, es zu lösen (und ehrlich gesagt, * ist eine schlechte Praxis in der Regel, weil sie latent Fehler verursachen können, da die Tabellenschemata entstehen ändern -. Sie tabelle1 tun können *, table2.acolumn, tabl2.bcolumn, wenn Sie alle einen Tisch wollen und selektiv aus einem anderen), aber wenn PostgreSQL INFORMATION_SCHEMA unterstützt, können Sie so etwas wie:

DECLARE @sql AS varchar

SELECT @sql = COALESCE(@sql + ', ', '') 
    + '[' + TABLE_NAME + '].[' + COLUMN_NAME + ']'
    + CHAR(13) + CHAR(10)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME IN ('table1', 'table2')
ORDER BY TABLE_NAME, ORDINAL_POSITION

PRINT @sql

Und die Ergebnisse einfügen in eine Menge Tipparbeit zu sparen. Sie werden manuell alias die Spalten müssen, die den gleichen Namen, natürlich haben. Sie können auch Code-gen eindeutige Namen, wenn Sie mögen (aber ich weiß nicht):

SELECT @sql = COALESCE(@sql + ', ', '') 
    + '[' + TABLE_NAME + '].[' + COLUMN_NAME + '] '
    + 'AS [' + TABLE_NAME + '_' + COLUMN_NAME + ']'
    + CHAR(13) + CHAR(10)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME IN ('table1', 'table2')
ORDER BY TABLE_NAME, ORDINAL_POSITION
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top