Select über 2 Tabellen mit leeren Feldern

Hallo,
weiß nicht so genau wie ich das Problem beschreiben soll. Deshalb ist es auch schwer für mich danach zu suchen.
Ich versuch’s mal zu formulieren:

Ich habe 2 Tabellen:

[modules]
modules_id
modules_name

[modules_template]
modules_id
modules_template

Die Tabelle [modules] enthält eine Liste mit verfügbaren Modulen.
Die Tabelle [modules_templates] enthält eine Verknüpfung einer Modul-ID mit einem Dokumententemplate-Namen.
Es kann mehrere Templates für ein Moduk geben. Es kann aber auch kein einziges Template für alle Module geben. Deshalb hier die strikte Trennung zwischen Modulen und Templates.

Aus speziellen Gründen muss meine Abfrage in einem einzigen Statement erledigt sein.
Die Abfrage soll enthalten:

  • modules_id
  • modules_name
  • modules_template

Wobei es ja, wie oben schon erklärt, vorkommen kann dass ein Modul kein Template gesetzt hat. So hab ichs auch prima hinbekommen. War ziemlich einfach:

SELECT		
modules.modules_id,
modules.modules_name,
modules_template.modules_template
FROM modules, modules_template
WHERE modules.modules_id=modules_template.modules_id;

Das Ergebnis sieht dann Beispielsweise so aus:

[modules_id - modules_name - modules_template]
1 - ModulB - Template_a
2 - ModulC - Template_b

Doch im Ergebnis muss nicht nur die Verbindung zwischen Modul und Template auftauchen sondern im Ergebnis müssen ebenfalls alle in [modules} verzeichneten Module auftreten.

D.h. das Ergebnis muss so aussehen können:

[modules_id - modules_name - modules_template]
0 - ModulA - null
1 - ModulB - Template_a
2 - ModulC - Template_b
3 - ModulD - null

Ist das ohne weiteres Möglich? Wenn ja: Wie?
Ich weiß nicht genau nach was ich suchen soll…
Wäre für jede Hilfe dankbar…

Gruß
Alex

hi,

schau dir mal den befehl LEFT JOIN an. damit geht das…

SELECT t1.f1, t1.f2, t2.f2
FROM t1 LEFT JOIN t2 ON t1.f1 = t2.f1

cu tb

Hey danke…

habs hinbekommen:

SELECT		
modules.modules_id,
modules.modules_name,
modules_template.modules_template
FROM modules
LEFT JOIN modules_template ON modules.modules_id = modules_template.modules_id;

Vielen Dank für die schnelle Hilfe …

  • Alex

Hallo,

Ich greife einfach mal diesen Thread auf, da er schon fast genau das Problem enthält was ich gerade habe. :slight_smile:

Ich habe eine ähnliche Tabellenstruktur:

[counterdetails]
cdid
filename

[counted]
cid
counterid
datum

Das ganze ist ein Aufrufzähler für bestimmte Dateien. Alle Dateien sind in der Tabelle counterdetails aufgelistet. In die Tabelle counted wird bei jedem Aufruf einer Datei ein Datensatz geschrieben, der eine eigene ID (cid), die ID der Datei (aus counterdetails = cdid) in counterid und das Datum in datum beinhaltet.
In einer Gesamtabfrage sind auch die Dateien mit dabei, wo noch nie jemand drauf zugegriffen hat = keine Einträge in counted mit dieser ID. Ich würde aber jetzt gerne eine Abfrage erstellen in der nur diese Dateien vorkommen, die eben noch keinen Eintrag in der Tabelle counted aufweisen. Hätte jemand einen Vorschlag? :slight_smile:

Quasi sowas:

test=*# select * from counterdetails;
 cdid | filename
------+----------
    1 | file1
    2 | file2
    3 | file3
(3 rows)

Time: 0.955 ms
test=*# select * from counted;
 cid | counterid |   datum
-----+-----------+------------
   1 |         2 | 2007-02-27
(1 row)

Time: 1.696 ms
test=*# select * from counterdetails where cdid not in (select counterid from counted);
 cdid | filename
------+----------
    1 | file1
    3 | file3
(2 rows)

Oder?

Andreas

Vielen Dank akretschmer, es funktioniert wie gewünscht! :smiley: Mit verschachtelten selects hatte ich es noch nicht ausprobiert, aber man lernt immer dazu. Danke nochmal! :slight_smile: