SELECT-Abfrage überhaupt möglich?

nautiLus`

Erfahrenes Mitglied
hi, folgende datebank ist gegeben:

bewerb (name, jahr, preisgeld)
person (name, alter, adresse)
teilnehmer (bewerb, person, rang), teilnehmer.bewerb ref. bewerb.name, teilnehmer.person ref person.name

Frage:
Ermitteln Sie die jeweiligen Namen aller Paare von Personen gleichen Alters, die im selben Jahr an genau zwei Wettbewerben teilgenommen haben. Dabei sollen die beiden Personen im fraglichen Jahr nicht gemeinsam an einem Wettbewerb teilgenommen haben.

Soetwas ist prinzipiell in einer Datenbank mit einem SELECT nicht möglich, korrekt?
Dazu bräuchte ich dann schon PL/SQL (zb WHILE).

Seh ich das richtig?

mfg nauti
 
nautiLus` hat gesagt.:
Soetwas ist prinzipiell in einer Datenbank mit einem SELECT nicht möglich, korrekt?
Ich würde behaupten, dass es mit einem Query ohne weitere Programmiersprache möglich ist.
Fraglich ist, wie die Darstellung der Ergebnistabelle am Ende aussehen soll.
Außerdem wären Testdaten nicht schlecht, um das Problem besser überblicken zu können.

Gruß hpvw
 
Folgende Datensätze und Tables hab ich mir zusammengestellt:

Code:
CREATE TABLE bewerb (
    name VARCHAR(14) NOT NULL,
    jahr DATE NOT NULL,
    preisgeld NUMBER(10) NOT NULL,
    PRIMARY KEY(name)
);

CREATE TABLE person (
    name VARCHAR(14) NOT NULL,
    age NUMBER(10) NOT NULL,
    adresse VARCHAR(150) NOT NULL,
    PRIMARY KEY(name)
);

CREATE TABLE teilnehmer (
    bewerb VARCHAR(20) NOT NULL,
    person VARCHAR(14) NOT NULL,
    rang NUMBER(10) NOT NULL,
    PRIMARY KEY(bewerb, person),
    FOREIGN KEY(bewerb) REFERENCES bewerb(name),
    FOREIGN KEY(person) REFERENCES person(name)
);

/* 2 bewerbe */
INSERT INTO person (name, age, adresse) VALUES ('Sebastian', 23, 'Heuhaufenstrasse'); 
/* 3 bewerbe */
INSERT INTO person (name, age, adresse) VALUES ('Christian', 24, 'Hafenstrasse'); 
/* 1 bewerb */
INSERT INTO person (name, age, adresse) VALUES ('Nudelaug', 30, 'Gablstraße'); 
/* 1 bewerb */
INSERT INTO person (name, age, adresse) VALUES ('Erich', 45, 'Marktstraße'); 
/* 2 bewerbe */
INSERT INTO person (name, age, adresse) VALUES ('Ludwig', 22, 'Geisterstrasse'); 
/* 2 bewerbe */
INSERT INTO person (name, age, adresse) VALUES ('Hanna', 56, 'Ludwigstrasse'); 
/* 1 bewerb */
INSERT INTO person (name, age, adresse) VALUES ('Rudolf', 24, 'Ludwigstrasse'); 
/* 2 bewerbe */
INSERT INTO person (name, age, adresse) VALUES ('Maria', 23, 'Lilienweg'); 
/* 1 bewerb */
INSERT INTO person (name, age, adresse) VALUES ('Gregor', 23, 'Hanselgasse'); 
/* 1 bewerb */
INSERT INTO person (name, age, adresse) VALUES ('Johanna', 22, 'Mariannenweg'); 
/* 0 bewerbe */
INSERT INTO person (name, age, adresse) VALUES ('Sabine', 20, 'Hundegasse'); 

INSERT INTO bewerb (name, jahr, preisgeld) VALUES ('PHP Bewerb', TO_DATE('2001','YYYY'), 7897);
INSERT INTO bewerb (name, jahr, preisgeld) VALUES ('Java Bewerb', TO_DATE('2001','YYYY'), 4353);
INSERT INTO bewerb (name, jahr, preisgeld) VALUES ('HTML Bewerb', TO_DATE('2002','YYYY'), 5634);
INSERT INTO bewerb (name, jahr, preisgeld) VALUES ('C++ Bewerb', TO_DATE('2003','YYYY'), 7685);
INSERT INTO bewerb (name, jahr, preisgeld) VALUES ('C Bewerb', TO_DATE('2004','YYYY'), 7977);
INSERT INTO bewerb (name, jahr, preisgeld) VALUES ('ASP Bewerb', TO_DATE('2005','YYYY'), 1500);

INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('PHP Bewerb', 'Christian', 2);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('PHP Bewerb', 'Sebastian', 1);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('Java Bewerb', 'Sebastian', 6);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('C Bewerb', 'Ludwig', 2);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('ASP Bewerb', 'Hanna', 5);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('C++ Bewerb', 'Ludwig', 1);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('HTML Bewerb', 'Nudelaug', 8);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('ASP Bewerb', 'Erich', 4);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('PHP Bewerb', 'Hanna', 12);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('Java Bewerb', 'Christian', 0);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('HTML Bewerb', 'Christian', 1);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('HTML Bewerb', 'Rudolf', 11);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('C++ Bewerb', 'Maria', 6);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('PHP Bewerb', 'Maria', 4);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('Java Bewerb', 'Gregor', 2);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('ASP Bewerb', 'Johanna', 23);

Wenn wer weiß wie das gehen könne wär ich dankbar.
nauti
 
In den Beispieldaten gibt es IMHO kein Paar, das Deinen Bedingungen genügt.
Daher ist es müßig, daran weiter zu probieren. Außer, Du postest mal ein gewünschtes Ergebnis und beschreibst Dein Problem genauer.
Hier der Auszug, den ich aus Deinen Beispieldaten generiert habe:
Code:
mysql> select
    ->   p1.name AS name1,
    ->   p1.age,
    ->   b1.name as bewerb,
    ->   b1.jahr
    -> from
    ->   person p1
    -> join teilnehmer t1
    ->   on t1.person=p1.name
    -> join bewerb b1
    ->   on t1.bewerb=b1.name
    -> order by jahr, age;
+-----------+-----+-------------+------------+
| name1     | age | bewerb      | jahr       |
+-----------+-----+-------------+------------+
| Maria     |  23 | PHP Bewerb  | 2001-01-01 |
| Sebastian |  23 | PHP Bewerb  | 2001-01-01 |
| Gregor    |  23 | Java Bewerb | 2001-01-01 |
| Sebastian |  23 | Java Bewerb | 2001-01-01 |
| Christian |  24 | PHP Bewerb  | 2001-01-01 |
| Christian |  24 | Java Bewerb | 2001-01-01 |
| Hanna     |  56 | PHP Bewerb  | 2001-01-01 |
| Christian |  24 | HTML Bewerb | 2002-01-01 |
| Rudolf    |  24 | HTML Bewerb | 2002-01-01 |
| Nudelaug  |  30 | HTML Bewerb | 2002-01-01 |
| Ludwig    |  22 | C++ Bewerb  | 2003-01-01 |
| Maria     |  23 | C++ Bewerb  | 2003-01-01 |
| Ludwig    |  22 | C Bewerb    | 2004-01-01 |
| Johanna   |  22 | ASP Bewerb  | 2005-01-01 |
| Erich     |  45 | ASP Bewerb  | 2005-01-01 |
| Hanna     |  56 | ASP Bewerb  | 2005-01-01 |
+-----------+-----+-------------+------------+
16 rows in set (0.01 sec)
Wie Du siehst, habe ich das ganze in MySQL gemacht. Dazu musste ich einige Deiner Spaltentypen (NUMBER) ändern und habe beim Einfügen des Datums jeweils den 1. Jan. dran gehängt.

Gruß hpvw

PS: Wenn Du noch prüfen möchtest, ob bei dem Import nichts schief gegangen ist, hier die Selects der einzelnen Tabellen:
Code:
mysql> select * from person;
+-----------+-----+------------------+
| name      | age | adresse          |
+-----------+-----+------------------+
| Christian |  24 | Hafenstrasse     |
| Erich     |  45 | Marktstraße      |
| Gregor    |  23 | Hanselgasse      |
| Hanna     |  56 | Ludwigstrasse    |
| Johanna   |  22 | Mariannenweg     |
| Ludwig    |  22 | Geisterstrasse   |
| Maria     |  23 | Lilienweg        |
| Nudelaug  |  30 | Gablstraße       |
| Rudolf    |  24 | Ludwigstrasse    |
| Sabine    |  20 | Hundegasse       |
| Sebastian |  23 | Heuhaufenstrasse |
+-----------+-----+------------------+
11 rows in set (0.00 sec)

mysql> select * from bewerb;
+-------------+------------+-----------+
| name        | jahr       | preisgeld |
+-------------+------------+-----------+
| ASP Bewerb  | 2005-01-01 |      1500 |
| C Bewerb    | 2004-01-01 |      7977 |
| C++ Bewerb  | 2003-01-01 |      7685 |
| HTML Bewerb | 2002-01-01 |      5634 |
| Java Bewerb | 2001-01-01 |      4353 |
| PHP Bewerb  | 2001-01-01 |      7897 |
+-------------+------------+-----------+
6 rows in set (0.00 sec)

mysql> select * from teilnehmer;
+-------------+-----------+------+
| bewerb      | person    | rang |
+-------------+-----------+------+
| ASP Bewerb  | Erich     |    4 |
| ASP Bewerb  | Hanna     |    5 |
| ASP Bewerb  | Johanna   |   23 |
| C Bewerb    | Ludwig    |    2 |
| C++ Bewerb  | Ludwig    |    1 |
| C++ Bewerb  | Maria     |    6 |
| HTML Bewerb | Christian |    1 |
| HTML Bewerb | Nudelaug  |    8 |
| HTML Bewerb | Rudolf    |   11 |
| Java Bewerb | Christian |    0 |
| Java Bewerb | Gregor    |    2 |
| Java Bewerb | Sebastian |    6 |
| PHP Bewerb  | Christian |    2 |
| PHP Bewerb  | Hanna     |   12 |
| PHP Bewerb  | Maria     |    4 |
| PHP Bewerb  | Sebastian |    1 |
+-------------+-----------+------+
16 rows in set (0.01 sec)
 
hi und vielen dank für deine mühe!
ich habe es jetzt so gelöst und hoffe es stimmt. dazu hab ich noch andere und passende datensätze genommen:

Code:
CREATE TABLE bewerb (
    name VARCHAR(14) NOT NULL,
    jahr DATE NOT NULL,
    preisgeld NUMBER(10) NOT NULL,
    PRIMARY KEY(name)
);
CREATE TABLE person (
    name VARCHAR(14) NOT NULL,
    age NUMBER(10) NOT NULL,
    adresse VARCHAR(15) NOT NULL,
    PRIMARY KEY(name)
);
CREATE TABLE teilnehmer (
    bewerb VARCHAR(20) NOT NULL,
    person VARCHAR(14) NOT NULL,
    rang NUMBER(10) NOT NULL,
    PRIMARY KEY(bewerb, person),
    FOREIGN KEY(bewerb) REFERENCES bewerb(name),
    FOREIGN KEY(person) REFERENCES person(name)
);
INSERT INTO person (name, age, adresse) VALUES ('Sebastian', 23, 'Heuhaufenstr.'); 
INSERT INTO person (name, age, adresse) VALUES ('Maria', 23, 'Lilienweg.'); 
INSERT INTO person (name, age, adresse) VALUES ('Gregor', 23, 'Hanselg.');
INSERT INTO person (name, age, adresse) VALUES ('Christian', 24, 'Hafenstr.'); 
INSERT INTO person (name, age, adresse) VALUES ('Rudolf', 24, 'Ludwigsg.'); 
INSERT INTO person (name, age, adresse) VALUES ('Sepp', 24, 'Treitlg.');
INSERT INTO person (name, age, adresse) VALUES ('Nudelaug', 30, 'Gablstr.'); 
INSERT INTO person (name, age, adresse) VALUES ('Erich', 45, 'Marktstr.'); 
INSERT INTO person (name, age, adresse) VALUES ('Ludwig', 22, 'Geisterstr.'); 
 
INSERT INTO bewerb (name, jahr, preisgeld) VALUES ('PHP Bewerb', TO_DATE('2001','YYYY'), 7897);
INSERT INTO bewerb (name, jahr, preisgeld) VALUES ('Java Bewerb', TO_DATE('2001','YYYY'), 4353);
INSERT INTO bewerb (name, jahr, preisgeld) VALUES ('C Bewerb', TO_DATE('2001','YYYY'), 7977);
INSERT INTO bewerb (name, jahr, preisgeld) VALUES ('ASP Bewerb', TO_DATE('2001','YYYY'), 1500);
INSERT INTO bewerb (name, jahr, preisgeld) VALUES ('HTML Bewerb', TO_DATE('2002','YYYY'), 5634);
INSERT INTO bewerb (name, jahr, preisgeld) VALUES ('XML Bewerb', TO_DATE('2002','YYYY'), 7685);
INSERT INTO bewerb (name, jahr, preisgeld) VALUES ('C# Bewerb', TO_DATE('2002','YYYY'), 4554);
INSERT INTO bewerb (name, jahr, preisgeld) VALUES ('Haskell Bewerb', TO_DATE('2002','YYYY'), 3534);
INSERT INTO bewerb (name, jahr, preisgeld) VALUES ('SQL Bewerb', TO_DATE('2003','YYYY'), 354);
INSERT INTO bewerb (name, jahr, preisgeld) VALUES ('CSS Bewerb', TO_DATE('2004','YYYY'), 55685);
 
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('PHP Bewerb', 'Christian', 2);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('C Bewerb', 'Christian', 2);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('Java Bewerb', 'Rudolf', 1);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('ASP Bewerb', 'Rudolf', 6);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('C Bewerb', 'Rudolf', 6);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('HTML Bewerb', 'Sebastian', 2);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('XML Bewerb', 'Sebastian', 1);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('C# Bewerb', 'Maria', 8);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('Haskell Bewerb', 'Maria', 8);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('ASP Bewerb', 'Nudelaug', 4);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('Java Bewerb', 'Erich', 0);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('HTML Bewerb', 'Ludwig', 1);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('HTML Bewerb', 'Sepp', 1);
INSERT INTO teilnehmer (bewerb, person, rang) VALUES ('HTML Bewerb', 'Gregor', 1);

folgendes query:

Code:
SELECT DISTINCT ps2.name, p1.name, count(b.name) as cnt, to_char(b.jahr,'YYYY'), p1.age
FROM person p1, person ps2, teilnehmer t, teilnehmer t_, bewerb b, bewerb b_ 
WHERE t.person = ps2.name 
AND t_.person = p1.name 
AND b.name = t.bewerb 
AND b_.name = t_.bewerb 
AND ps2.name > p1.name 
AND to_char(b.jahr,'YYYY') = to_char(b_.jahr,'YYYY')
AND b.name <> b_.name 
AND ps2.age = p1.age
GROUP BY ps2.name, p1.name, b.jahr, b.name, p1.age
HAVING count(b.name) = 2;

ausgabe:

Code:
NAME           NAME                  CNT TO_C        AGE
-------------- -------------- ---------- ---- ----------
Sebastian      Maria                   2 2002         23
Rudolf         Christian               2 2001         24

nauti

PS: das ganze war unter ORACLE.
 
Zuletzt bearbeitet:
Sowas ähnliches schwebte mir auch im Kopf rum.
Ich mochte halt nur nicht testen, wenn ich so schon sehe, dass es zu keinem Ergebnis führt.
Die Kontrollmöglichkeit ist dann etwas schwierig.
Markiere das Thema bitte unten rechts noch als erledigt.

Gruß hpvw
 
Zurück