SQL Frage

Helveticus

Member
Themenstarter
Registriert
29 Feb. 2008
Beiträge
744
Hallo

Da hier im Forum ja viele potente Mitglieder sind (in Bezug auf die Geisteskraft), wende ich mich mit meiner Frage zu einem SQL Problem an euch.

Und habe ich folgendes Query.

select Name, Geburtstag
from User
where bla bla

Nun wird ja eine Tabelle mit zwei Spalten ausgegeben. Ich möchte diese Tabelle aber um weitere Spalten erweitern damit ich sie mit einer anderen Tabelle vereinen kann (union), dafür müssen die Tabellen ja gleich gross sein.

Ist folgende Vereinigung korrekt?

(select Name, Geburtstag
from User
where bla bla)
union
(select Name, Geburtstag, Alter, Wohnort)
from Admin
where bla bla)

Also meine Idee ist, dass bei der Vereinigung nachher 4 Spalten "Name", "Geburtstag", "Alter" und "Wohnort" gibt, wobei alle Tupel mit aus der ersten Relation (wo nur Name und Geburtstag selektiert werden) bei Alter und Wohnort Nullwerte haben. ist das so korrekt?
 
Beide "vereinigten" Tabellen müssen im SELECT die gleiche Anzahl Spalten aufweisen, welche auch jeweils vom gleichen Typ sein müssen. Außerdem läßt UNION in der Ergebnissmenge alles Doppelte wech...
 
select Name, Geburtstag, NULL AS Alter, NULL AS Wohnort
from User
where bla bla
union ALL
select Name, Geburtstag, Alter, Wohnort
from Admin
where bla bla
 
Vielen Dank. Das mit null as... ist noch elegant.

Was würdet denn jetzt z.B. mit folgendem Query passieren? Name sei vom gleichen Typ wie Strasse (varchar) und Geburtstag vom gleichen Typ wie id (integer).

(select Name, Geburtstag
from User
where bla bla)
union
(select Strasse, ID)
from Admin
where bla bla)


Ich habe noch kurz eine Frage zu Sichten bzw. views. In eine Sicht kann man ja in bestimmten Fällen auch Tupel einfügen. Nehmen wir eimal folgende Sicht an.

create view Thinkpad_Users as
select *
from User
where Land = Deutschland;

In diese Sicht sollte es ja möglich sein Tupel einzufügen.

insert into Thinkpad_Users
values (bla bla);

Müssen die eingefügten Tupel die where Bedingung auch erfüllen? Die Änderung wird ja in die Relation User propagiert.
 
Vielen Dank. Das mit null as... ist noch elegant.

Was würdet denn jetzt z.B. mit folgendem Query passieren? Name sei vom gleichen Typ wie Strasse (varchar) und Geburtstag vom gleichen Typ wie id (integer).

(select Name, Geburtstag
from User
where bla bla)
union
(select Strasse, ID)
from Admin
where bla bla)

Würde funktionieren, solange die Datentypen kompatibel sind. Das mit dem AS war notwendig, weil die erste Abfrage die Spaltennamen festlegt.

Ich habe noch kurz eine Frage zu Sichten bzw. views. In eine Sicht kann man ja in bestimmten Fällen auch Tupel einfügen. Nehmen wir eimal folgende Sicht an.

create view Thinkpad_Users as
select *
from User
where Land = Deutschland;

In diese Sicht sollte es ja möglich sein Tupel einzufügen.

insert into Thinkpad_Users
values (bla bla);

Müssen die eingefügten Tupel die where Bedingung auch erfüllen? Die Änderung wird ja in die Relation User propagiert.

Das kommt auf das DBMS an, bei Oracle z.B. wird das nur geprüft wenn die Check-Option für den View angeschaltet ist.
Generell halte ich aber das Updaten von Views für suboptimal. Wenn man keine Logik in der Datenbank braucht, ist es das Beste, direkt auf die Tabelle zu gehen. Wenn man datenbankseitige Logik braucht, ist eine Stored Procedure wesentlich besser geeignet.
 
Zuletzt bearbeitet:
Also meine Idee ist, dass bei der Vereinigung nachher 4 Spalten "Name", "Geburtstag", "Alter" und "Wohnort" gibt, wobei alle Tupel mit aus der ersten Relation (wo nur Name und Geburtstag selektiert werden) bei Alter und Wohnort Nullwerte haben. ist das so korrekt?

Wieso kein OUTER JOIN ?
 
  • ok1.de
  • ok2.de
  • thinkstore24.de
  • Preiswerte-IT - Gebrauchte Lenovo Notebooks kaufen

Werbung

Zurück
Oben