Zitat von protestix
Beitrag anzeigen
Ankündigung
Einklappen
Keine Ankündigung bisher.
PostgreSQL: Join klappt nicht.
Einklappen
Neue Werbung 2019
Einklappen
X
-
-
Ich sitze gerade auf Teneriffa und habe nur mein Handy parat, mal ein etwas anderer Ansatz in SQLite weil mein Galaxy Note 4 hiermit besser umgeht.
1.) Ich will wissen wer an einem bestimmten Datum da war.
Code:select playername from (select playername from (select player_id, (select rowid from trainings where datum = '2019-02-02') as trainID from teilnahme where training_id = trainID) inner join player on player.rowid = player_id) as playername
Code:select playername from player except select playername from (select playername from (select player_id, (select rowid from trainings where datum = '2019-01-01') as trainID from teilnahme where training_id = trainID) inner join player on player.rowid = player_id) as playername
Kommentar
-
Ich muss dann doch noch mal schreiben, dachte wär alles klar.
Zitat von Alf2016 Beitrag anzeigen..
Code:SELECT name, trainingsdatum FROM player CROSS JOIN trainings;
Code:SELECT name, trainingsdatum FROM player, trainings;
Aber schön ist es trotzdem, wenn es da steht. Dann weiß eine dritte Person, dass es wirklich Absicht ist und niemand was vergessen hat.
Warum es überhaupt cross sein soll und die daraus folgenden Performanceaspekte, verstehe ich allerdings nicht?
Auch nicht warum Akretschmer mit dem Array kommt, nur weil pg es kann?
Ok, vielleicht habe ich die Aufgabenstellung nicht verstanden. In Pg wäre es so:
Code:select * from player p full outer join player_training pt on p.pid = pt.player_id full outer join trainings t on pt.training_id = t.tid order by <ReplaceWithWhatEverYouNeed>
Code:select *, case when tid is null then 'keine Trainings' when pid is null then 'keine Teilnehmer' else '' end as generated_remark from player p full outer join player_training pt on p.pid = pt.player_id full outer join trainings t on pt.training_id = t.tid
* und ja, wir alle wissen, Stern ist böse, hier alles egal und man kann jede Spalte sehen, gefüllt oder null, also was da passiert.
- 1 Likes
Kommentar
-
kaminbausatz
Mysql kennt mal wieder kein Except und MINUS geht bei vielen auch nicht.
Sollte erwähnt werden, falls das jemand mit Mysql anstatt Sqlite ausprobiert.
Kommentar
-
Zitat von kaminbausatz Beitrag anzeigenIch sitze gerade auf Teneriffa und habe nur mein Handy parat, mal ein etwas anderer Ansatz in SQLite weil mein Galaxy Note 4 hiermit besser umgeht.
1.) Ich will wissen wer an einem bestimmten Datum da war.
Code:select playername from (select playername from (select player_id, (select rowid from trainings where datum = '2019-02-02') as trainID from teilnahme where training_id = trainID) inner join player on player.rowid = player_id) as playername
Code:select playername from player except select playername from (select playername from (select player_id, (select rowid from trainings where datum = '2019-01-01') as trainID from teilnahme where training_id = trainID) inner join player on player.rowid = player_id) as playername
Kommentar
-
Zitat von kaminbausatz Beitrag anzeigen1.) Ich will wissen wer an einem bestimmten Datum da war.
Code:select playername from (select playername from (select player_id, (select rowid from trainings where datum = '2019-02-02') as trainID from teilnahme where training_id = trainID) inner join player on player.rowid = player_id) as playername
Zitat von Perry Staltic Beitrag anzeigenWarum es überhaupt cross sein soll und die daraus folgenden Performanceaspekte, verstehe ich allerdings nicht?
Ob die Fragestellung in der Form sinn macht, sei mal dahin gestellt. (mit ein paar mehr Bedingung kann es sinn machen)
Zitat von Perry Staltic Beitrag anzeigenAuch nicht warum Akretschmer mit dem Array kommt, nur weil pg es kann?
Zitat von Perry Staltic Beitrag anzeigenOk, vielleicht habe ich die Aufgabenstellung nicht verstanden. In Pg wäre es so:
- 1 Likes
Kommentar
-
Zitat von Alf2016 Beitrag anzeigen
Ist das getestet? Wenn ja, mit welchem Ergebnis?
@erc
Riesenwind und keine Lösung...
Kommentar
-
Zitat von erc Beitrag anzeigenWeil das die Fragestellung so vorgibt. Du willst für jedes Traning wissen, welches Mitgleid anwesend bzw. nicht anwesend war. Da "alle anwesenden Mitglieder" plus "alle nicht anwesenden Mitgleider" gleich alle Mitgleider ist, hast du ein Kreuzprodukt zwischen Traning und Mitgliedern.
Ob die Fragestellung in der Form sinn macht, sei mal dahin gestellt. (mit ein paar mehr Bedingung kann es sinn machen)
Sinn macht die Fragestellung auch in der Form, solche Listen und Aushänge sind bei Kursen und Vereinen recht häufig zu sehen
Dann also mit cross join:
Code:select *, case when training_id is null then 'nicht anwesend' else 'anwesend' end as generated_remark from player p cross join trainings t left join player_training pt on (t.tid, p.pid) = (pt.training_id,pt.player_id) order by <ReplaceWithWhatEverYouNeed>
Kommentar
-
Zitat von Alf2016 Beitrag anzeigenSo, ich gehe mal davon aus, daß der TE keine Lust mehr hat oder einen anderen "Weg" gefunden hat oder im besten Fall mit seiner eigentlichen Aufgabe beschäftigt ist und liefere mal ab, was sich hier bei mir noch im "Arbeitsspeicher" befindet. Das wäre in dem Falle die ausführliche Lösung incl. Herleitung bzw. Heranführung soweit es um SQL geht. Wenn der TE doch lieber selbst die Lösung finden möchte, kann er dies hier ja ignorieren..
Lust ist sicher noch da. Aber erst die Struktur. Das nehme ich jetzt aus dem Thread mit.....
Kommentar
-
Zitat von Perry Staltic Beitrag anzeigen
Ok, also wenn "Am 2019-10-10 war nur Andreas im Training. Bei den anderen soll NULL stehen." das für Euch so klar eine solche Liste verlangt, in der pro Training jedes Mitglied aufgeführt ist, dann muss es cross join sein. Ich hatte es so verstanden, dass einfach jedes Mitglied und jedes Training erscheinen soll. Nach dem Motto "Karl gibt's auch, aber der war nie da".
Sinn macht die Fragestellung auch in der Form, solche Listen und Aushänge sind bei Kursen und Vereinen recht häufig zu sehen
Dann also mit cross join:
Code:select *, case when training_id is null then 'nicht anwesend' else 'anwesend' end as generated_remark from player p cross join trainings t left join player_training pt on (t.tid, p.pid) = (pt.training_id,pt.player_id) order by <ReplaceWithWhatEverYouNeed>
erc liefert m.E. die überzeugendsten Beiträge.
Kommentar
-
Zitat von kaptainIglo Beitrag anzeigen
Ne der TE geht seiner Arbeit nach und kommt gerade aus dem Training. Jetzt hat er Zeit das alles zu lesen.
Lust ist sicher noch da. Aber erst die Struktur. Das nehme ich jetzt aus dem Thread mit.....
Kommentar
-
Man sieht doch das es richtig ist. Wenn ich von einer Ergebnismenge eine andere Ergebnismenge wegnehme oder subtrahiere, dann bleibt halt nur was übrig?
Genau das macht EXCEPT.
Er holt erst alle Spieler und zieht dann die Spieler ab die beim Training anwesend waren. Übrig bleiben dann die Spieler die nicht teilgenommen haben.
Du kannst es auch selber ausprobieren und wenn du eine Fehler findest meldet du dich einfach wieder.
Mit Mysql geht das jedoch nicht!
Kommentar
-
Zitat von protestix Beitrag anzeigenMan sieht doch das es richtig ist. Wenn ich von einer Ergebnismenge eine andere Ergebnismenge wegnehme oder subtrahiere, dann bleibt halt nur was übrig?
Genau das macht EXCEPT.
Er holt erst alle Spieler und zieht dann die Spieler ab die beim Training anwesend waren. Übrig bleiben dann die Spieler die nicht teilgenommen haben.
Du kannst es auch selber ausprobieren und wenn du eine Fehler findest meldet du dich einfach wieder.
Mit Mysql geht das jedoch nicht!
Kommentar
Kommentar