[quote=Unregistered]a) geht z.B. mit minus[/quote]oder mit not in
[SQL]select * from A
where a.id not in( select nvl(b.fk,-1) from B b)[/SQL]Falls fk in B nie null ist kann das nvl wegfallen.
[quote=Machareder;113064][quote=CyborgBeta;113063]d) Ist es legitim, wenn jede Tabelle immer ‘nur’ einen eigenen Primärschlüssel hat, der nix mit dem (n) Fremdschlüssel (n) in derselben Tabelle zu tun hat? Würdest du das auch so machen?[/quote]Das kommt immer auf die Situation an, du kannst auch aus zwei Fremdschlüssel einen Primärschlüssel bauen. Er muss halt nur eindeutig sein.[/quote]Es muss fachlich sinnvoll sein.
Ist die Tabelle ein reines Mapping um eine m-n
Beziehung zu realisieren? Dann wäre ein zusätzlicher unabhängiger Primärschlüssel unnötig und die Kombination der Fremdschlüssel kann als Primärschlüssel genutz werden (sofer keine Kombination mehrfach vorkommen soll, oder ein Fremdschlüssel optional ist). Wenn es aber außer den Fremdschlüsseln weitere fachliche Attribute gibt, und die Fremdschlüssel sich unabhängig von diesen ändern können ist ein separater unabhängiger Primärschlüssel hilfreich.
[quote=CyborgBeta;113063]Auch das theoretische kartesische Produkt umfasst viel zu viel.
a) Kannst du mir etwas über cross join, outer, inner, union und natural usw. join sagen?[/quote]cross join
ist genau dass: das karthesische Produkt.
inner join
selektiert aus der beiden beteiligten Tabellen alle Einträge, für die die join-Bedingung (idR. Gleichkeit des FK->PK) zutrifft. Dabei wird jede Zeile aus der Tabelle, bei der das Attribut der PK ist so oft wiederholt, wie es entsprechende Treffer in der anderen Tablelle gibt, wo das Attribut der FK ist.
outer join
mach nur Sinn, wenn der FK NULL
sein kann oder es keinen refferential constraint auf den FK-Attribut gibt. In dem Fall kann die Tabelle wo das Attribut der FK ist für diesen Werte enthalten, die in der referenzierten Tabelle nicht als PK vor kommen. outer join
liefert auch diese Zeilen aus der abhängigen Tabelle.
union
ist kein join.
Du erzeugst eine virtuelle Tabelle aus 2 Queries. ACHTUNG: beide Queries müssen übereinstimmende Anzahl von Attributen haben und deren Typen müssen in der Reihenfolge zusammen passen. Die Namen der Attribute müssen nicht gleich sein (zumindest bei Oracle).
BTW: wenn die 2 Queries keine überschneidende Ergebnismenge haben sollte man union all
nutzen, weil beim union
ohne all
Oracle die Duplicate entfernt, wass natürlich Zeit kostst, selbst wenn es keine Duplikate gibt.
natural join
ist gefährlich!
Oracle (andere womöglich auch) entscheidet auf Grund von Namensgleichkeit, welche Attribute die PF/PK Beziehung darstellen. Viele Anwendungen haben an den Tabellen “Status”-Attribute (zb: insert_date
, update_date
oder auch status
). Die würde Oracle ebenfalls als FK/PK-Beziehung ansehen. Dass Du dann nie Treffer bekommst dürfte klar sein…
Schlimmer ist aber, dass Du Probleme bekommen kannst, wenn später ein Attribut zu einer Tabelle hinzugefügt wird, das es in einer anderen Tabelle schon gibt. Dann hat Deine Anwendung plötzlich keine Ergebnisse mehr und keiner weis warum…
bye
TT