create view

Hallo,

ich versuche mit pgAdmin Tool eine Ansicht aus zwei Tabellen zu erstellen, wo es zwei Spalten mit dem gleichen Name gibt. Ich kriege selbstverständlich die Fehlermeldung.
Ein Beispiel:
Tabelle1 mit den Spalten:
t1_id_PK, Bezeichnung, t2_id_FK
Tabelle2:
t2_id_PK, Bezeichnung, Nummer
View:
select * from Tabelle1 INNER JOIN Tabelle2 ON Tabelle1.t2_id_FK= Tabelle2.t2_id_PK;

Kann ich das Problem irgendwie umgehen oder muss ich eine Spalte in einer Tabelle umbenennen?

Danke,

Igor

SELECT spalte1 AS spalte5 FROM ...

Hallo,

Danke für die schnelle Antwort.
Gibt es die Möglichkeit mit “select *” solche Ansichte zu erstellen?
Der Grund dafür ist, dass man die Views nicht editieren muss, wenn die Tabellen geändert wurden.

Jein. Du kannst VIEWS mit 'SELECT * … ’ erstellen, diese enthalten dann aber dennoch die korrekte Spaltendefinition. Wowereit.

Andreas

Hallo Andreas,

Ich habe leider das nicht verstanden.
Z.B. erweitere ich die Tabelle 1 mit der zusätzliche Spalte ‘Unternummer’. Dann muss ich auch meine View erweitern, wenn ich die View so erstelle, wie Ads vorgeschlagen hat.
Meine Frage ist, ob ich bei "select * " bleiben kann und das Problem mit der Spalten mit gleichen Namen umgehen kann?

Igor.

Ich glaube, das sind 2 Probleme:

Problem 1:
Wenn sich die einem VIEW zugrunde liegende Basistabelle ändert, wirkt sich das nicht auf den VIEW aus.

test=*# create table basis (t1 int, t2 int);
CREATE TABLE
test=*# create view view_basis as select * from basis;
CREATE VIEW
test=*# alter table basis drop column t2;
NOTICE:  rule _RETURN on view view_basis depends on table basis column t2
NOTICE:  view view_basis depends on rule _RETURN on view view_basis
ERROR:  cannot drop table basis column t2 because other objects depend on it
HINT:  Use DROP ... CASCADE to drop the dependent objects too.
test=!#

Der VIEW enthält also nicht die vor Dir gewählte Spaltenauswahl, also *, sondern die exakte Definition. Und das ist auch wirklich gut so.

Problem 2:
Wenn Du 2 Tabellen hast, welche gleiche Spaltennamen haben, dann wirst Du bei einem JOIN darauf, welcher ein VIEW erzeugen soll, in diesem VIEW die Spalten eindeutig benennen müssen:

test=# create table basis (t1 int, t2 int);
CREATE TABLE
test=*# create table basis2 (t1 int, t3 int);
CREATE TABLE
test=*# select * from basis left join basis2 on (basis.t1=basis2.t1);
 t1 | t2 | t1 | t3
----+----+----+----
(0 rows)

test=*# create view view_basis as select * from basis left join basis2 on (basis.t1=basis2.t1);
ERROR:  column "t1" specified more than once
test=!# rollback;
ROLLBACK
test=# create table basis (t1 int, t2 int);
CREATE TABLE
test=*# create table basis2 (t1 int, t3 int);
CREATE TABLE
test=*# create view view_basis as select basis.t1, basis.t2, basis2.t1 as "basis2.t1", basis2.t3 from basis left join basis2 on (basis.t1=basis2.t1);
CREATE VIEW
test=*# \d view_basis
    View "public.view_basis"
  Column   |  Type   | Modifiers
-----------+---------+-----------
 t1        | integer |
 t2        | integer |
 basis2.t1 | integer |
 t3        | integer |
View definition:
 SELECT basis.t1, basis.t2, basis2.t1 AS "basis2.t1", basis2.t3
   FROM basis
   LEFT JOIN basis2 ON basis.t1 = basis2.t1;

test=*#

Andreas

Hallo Andreas,

wenn ich jetzt richtig verstehe, funktioniert das nur so, wie Ads vorgeschlagen hat oder muss ich die Spalten (für ‘select * …’ Variante) umbenennen.
Andere Lösung gibt es nicht.
Richtig ?


Grüße,

Igor

siehe ads.

Andreas