Abfragen Oracle

freakhouse

Ensign
Registriert
Okt. 2005
Beiträge
151
Hallo liebe Community,
ich hänge gerade an einer Abfrage in Oracle, vllt könnt ihr mir helfen...

erstmal das Create und Insert-Skript:

DROP TABLE Sendung;
DROP TABLE Film;
DROP TABLE Sender;


CREATE TABLE Sender (
SenderID INTEGER NOT NULL ,
Name VARCHAR(30) ,
PRIMARY KEY(SenderID));


CREATE TABLE Film (
FilmID INTEGER NOT NULL ,
Titel VARCHAR(60) ,
PRIMARY KEY(FilmID));


CREATE TABLE Sendung (
SendungID INTEGER NOT NULL ,
FilmID INTEGER NOT NULL ,
SenderID INTEGER NOT NULL ,
StartZeit DATE ,
EndZeit DATE ,
PRIMARY KEY(SendungID),
FOREIGN KEY(SenderID)
REFERENCES Sender(SenderID),
FOREIGN KEY(FilmID)
REFERENCES Film(FilmID));

delete from Sendung;
delete from Sender;
delete from Film;

insert into Sender values (1, 'ARD');
insert into Sender values (2, 'ZDF');
insert into Sender values (3, 'WDR');
insert into Sender values (4, 'RTL');
insert into Sender values (5, 'SAT1');
insert into Sender values (6, 'VOX');
insert into Sender values (7, 'Pro7');
insert into Film values (1, 'Star Wars');
insert into Film values (2, 'Star Wars Episode 1');
insert into Film values (3, 'Star Wars Episode 2');
insert into Film values (4, 'Star Wars Episode 3 - Directors Cut');
insert into Film values (5, 'Fluch der Karibik');
insert into Sendung values (1, 1, 7, to_date('2011-04-07 20:15', 'yyyy-mm-dd hh24:mi'), to_date('2011-03-07 22:50', 'yyyy-mm-dd hh24:mi'));
insert into Sendung values (2, 2, 7, to_date('2011-04-14 20:15', 'yyyy-mm-dd hh24:mi'), to_date('2011-03-14 23:15', 'yyyy-mm-dd hh24:mi'));
insert into Sendung values (3, 3, 7, to_date('2011-03-21 20:15', 'yyyy-mm-dd hh24:mi'), to_date('2011-03-21 23:15', 'yyyy-mm-dd hh24:mi'));
insert into Sendung values (4, 4, 7, to_date('2011-03-28 20:15', 'yyyy-mm-dd hh24:mi'), to_date('2011-03-28 22:50', 'yyyy-mm-dd hh24:mi'));
insert into Sendung values (5, 4, 4, to_date('2010-02-06 20:15', 'yyyy-mm-dd hh24:mi'), to_date('2010-02-06 22:50', 'yyyy-mm-dd hh24:mi'));


Die Abfrage lautet, welche Welche Filme bzw Titel werden auf RTL UND! Pro 7 gezeigt,
bisher habe ich das hier

Code:
select titel
from film
join sendung using (filmID)
join sender using (senderID)
where name (....)


Ich schätze mal, dass ich mir der AND Anweisung arbeiten muss, allerdings habe ich das noch nie gemacht und finde auch nichts im Internet. um Hilfe wäre ich sehr dankbar ;)
 
Nicht getestet, aber sowas wie

select f.titel
from film f, Sendung s1, Sendung s2
where s1.SenderID != s2.SenderID and
s1.FilmID = s2.FilmID;

Sind aber unter Umständen Duplikate drin, wenn distinct nicht gewünscht ist musst du mit Mengen ran.

edit: achso, wenn speziell RTL und PRo7 gewünscht ist, dann natürlich die SenderIDs umbiegen, aber wie man mit and arbeitet weißt du jetzt ja :). Dachte du suchst Filme, welche auf mehreren Sendern laufen.
 
Zuletzt bearbeitet:
ich verstehe deine abfrage irgendwie nicht.... also ich suche lediglich die Filme die auf Pro7 und RTL laufen.. aber wie die AND-Anweisung einzugeben ist, ist mir immer noch nicht bekannt. bin neu auf dem gebiet :(
aber danke für deine antwort
 
Where klauseln die durch ein AND verbunden sind müssen bei der Abfrage alle mit TRUE beantwortet werden.

z.B.

...
Where FilmID=4 AND SenderID=4 gibt dir nur die Sendung 5 zurück ... weil das die einzige ist, wo beide Where klauseln erfüllt sind

du brauchst etwa sowas:

select f.titel
from film f, Sendung s
where s.SenderID IN ("SenderID von Pro7", "SenderID von RTL") AND
s.FilmID = f.FilmID;

würde ich nun sagen
 
Also um hier eine konkrete Antwort zu geben müsstest du uns zunächst eine konkrete Fragestellung mitteilen (bzw. deine Where Clause komplett angeben). Da das nicht der Fall ist, vermute ich einfach mal, dass du alle Sendungen zu einer bestimmten Uhrzeit auf den genannten bzw. auf ausgewählten Sendern suchst.

Hierfür wäre meine Vorgehensweise folgende:


Code:
SELECT titel
FROM film
WHERE filmid in (SELECT s2.filmid 
                          FROM sender s1,  sendung s2
                          WHERE s1.senderid = s2.senderID
                          AND s1.name in ('RTL', 'PRO7')
                          AND s2.startzeit >= $variable)
 
also so geht es, die frage ist nun, wie ich die beiden "einzelnen" where klauseln zusammenfügen kann

select titel
from film
join sendung using (FilmID)
join sender using (SenderID)
where name='Pro7';

oder eben where name='RTL';
 
das einfachste, ohne eine geschachtelte Select anfrage siehst du bei mir ... da musst du dann aber die senderID zu RTL und Pro7 finden
es is halt kein AND sondern IN in dem fall
 
Select film f
from film f, sender s1, sender s2, sendung sd1, sendung sd2
where s1.Name = 'RTL' and
s2.Name = 'Pro7' and
sd1.SenderID = s1.SenderID and
sd2.SenderID = s2.SenderID and
sd1.FilmID = sd2.FilmID and
sd1.FilmID = f.FilmID;

Wenn man die Sender als Klartext und nicht ID angeben möchte.

Bei den Lösungen von oben sehe ich nicht wie die funktionieren sollen, Sender in (...) muss nicht auf alles zutreffen, was in der Menge steht, ein Element reicht.
 
charom du hast offensichtlich die Tabellenstruktur gar nicht verstanden, wenn man sich deine beiden Beiträge anschaut.

SELECT f.Titel FROM Film f, Sendung s, Sender t
WHERE (t.SenderID=s.SenderID AND f.FilmID=s.FilmID) AND (t.Name='RTL' OR t.Name="Pro7")

An den Autor:
Bitte noch mal die Namensgebung in deinen Tabellen überdenken. In der Regel lässt man den Tabellennamen nicht nochmal in die Spaltennamen einfließen.
->
Film
ID
Titel

Sendung
ID
FilmID
SenderID
....
 
Wie du siehst an den zahlreichen antworten gibt es viele möglichkeiten.
an sich war deine frage wie man mehre where Bedingung verknüpft
hier für hast du AND oder OR. in deinem fall wär ein or angebracht:
Code:
select titel
from film
join sendung using (filmID)
join sender using (senderID)
where name = 'Pro7' or name = 'RTL'

schöner wäre es aber mit IN weil es das qry leichter zu lesen macht,
wobei in eine liste an Wörter haben kann und wenn irgendwas zutrifft ist es ein Treffer:

Code:
select titel
from film
join sendung using (filmID)
join sender using (senderID)
where name in('Pro7','RTL')

jetzt gebe es noch die gefahr, was ist wenn ein 2. tabelle mit den spalten namen "name" gibt?
daher wäre es sinnvoll den tabellen alias zu geben und sie darüber eindeutig anzusprechen
so vermeidet man das erwähnte problem:


Code:
select a.titel
from film a
join sendung b using (filmID)
join sender c using (senderID)
where c.name in('Pro7','RTL')

weiterer gefahren punkt ist groß klein schreibung in der db welt weil die frage case sensitiv ist
und daher könnte eine abfrage gegen die wand laufen wenn man statt RTL rtl schreibt
daher bringt man eine spalte alle zeichen klein oder groß und man muss sich mit dem problem nicht beschäftigen:

Code:
select a.titel
from film a
join sendung b using (filmID)
join sender c using (senderID)
where lower(c.name) in('pro7','rtl')

Und zu aller jetzt ist noch using ein gefährliche stelle was ist wenn aus irgendein grund mehr spalten mit senderID oder filmID vorkommen?
daher sollten wir hier auch explizit sagen wer mit wem gejoint wird, das funktioniert mit ON klausel:

Code:
select a.titel
from film a
join sendung b ON a.filmID = b.filmID
join sender c ON b.senderID = c.senderID
where lower(c.name) in('pro7','rtl')

Qry sollten soweit alle gehen habe sie an einer lokalen Oracle instanz getestet.

EDIT:
_Chris_ schrieb:
An den Autor:
Bitte noch mal die Namensgebung in deinen Tabellen überdenken. In der Regel lässt man den Tabellennamen nicht nochmal in die Spaltennamen einfließen.
....

Absolut falsch,
der pk besteht aus tabellen name und pk fixe.
Das Problem bei deiner verfahren das du jedes mal wenn den pk als fk
benutzen willst die Spalte anders nennen muss und beim join kein using benutzen kannst,
des weiteren ist es nicht gerade schön zu lesen „ON a.nameID = b.id“
Wobei hier tabellen namen in Plural ist und der pk in Singular.
Das letztere muss man für sich selbst festlegen, nur dann durch ziehen.

Aso es gibt 2 Arten wie man ein Join schreiben kann hier im Thread kommen beide vor daher kleine erläuterung:
Früher gabs nur
Code:
select * from a,b where a.id = b.id
Hier mit lassen sich aber left ,right und full join schwer schreiben daher gabs in ein paar sql versionen später ein join klausel
Code:
Select * from a Join b ON a.id = b.id;
Beide schreibweisen werden von oracle als join erkennt und so gehändelt wobei letzteres moderene weg ist.
 
Zuletzt bearbeitet:
Hallo AlbertLast,

wenn du schon Namensempfehlungen gibts und die Anmerkung in meinem Post als "absolut falsch" darstellst, dann mach du es doch bitte "absolut richtig".

Wenn ich schon den Tabellennamen einfließen lasse, dann bitte als Prefix abgetrennt und konsequent in allen Spalten.


Da ich aber in der Regel mit SQL-Systemen arbeite, die mit FQN zurecht komme, entwerfe ich meine Anwendungen (das kann hier jeder handhaben wie er will) ohne Tabellen-Prefix.
Denn
Code:
SELECT Order.ID, Order.Name. Order.Date FROM Order
ließt sich besser als
SELECT Order.Order_ID, Order.Order_Name, Order.Order_Date FROM Order

Aus dem gleichen Grund benutze ich auch keine Using-Anweisungen im Join, da du hier einfach eine anonyme Spalte ohne Tabellennamen aus dem Select bekommst. Kann ziemlich blöd werden, insbesondere wenn deine ganzen (wie von dir vorgeschlagen) FKs und PKs gleich heißen. Auch wird using von einigen (auch sehr aktuellen) SQL-Systemen gar nicht unterstützt - hat es doch höchstens kosmetische Gründe es einzusetzen.

Aso es gibt 2 Arten wie man ein Join schreiben kann hier im Thread kommen beide vor daher kleine erläuterung:
Früher gabs nur
Code:
select * from a,b where a.id = b.id

Vorsicht, WHERE ist in der Regel zwar ein join zwischen dem Tabellen, häufig intern aber anders umgesetzt. Hier gibts es teilweise große Unterschiede.
 
_Chris_ schrieb:
Vorsicht, WHERE ist in der Regel zwar ein join zwischen dem Tabellen, häufig intern aber anders umgesetzt. Hier gibts es teilweise große Unterschiede.

dafür hätte gern eine quelle, beweis
denn execution plan den ich bis jetzt von rdbms gesehn habe
arbeitet beides nämlich gleich
 
_Chris_ schrieb:
charom du hast offensichtlich die Tabellenstruktur gar nicht verstanden, wenn man sich deine beiden Beiträge anschaut.

Nein, ich habe lediglich genau das gemacht, was der TS wollte.

Die Abfrage lautet, welche Welche Filme bzw Titel werden auf RTL UND! Pro 7 gezeigt,

Das "und" hat er sogar noch groß geschrieben und mit Ausrufezeichen versehen.
Wenn er was anderes haben möchte, dann muss er es auch richtig hinschreiben.
 
Zurück
Oben