# Denkfehler bei SQL-Befehl



## SamHotte (2. Feb 2006)

Moin,

ich hab ein Denkproblem für meinen Datenbankzugriff, vielleicht kann ja einer helfen.

Ich habe zwei Relationen, die ich über eine dritte miteinander verknüpfen möchte (n:m-Beziehung). Die Schemata sehen vom Prinzip her so aus (die Feldnamen sind anders, aber das ist ja hier egal):

EINS(nummer_eins, zeitstempel, ...)
ZWEI(nummer_zwei, ...)
REL(nummer_eins, zeitstempel, nummer_zwei)

Relation ZWEI repräsentiert einen Baum, EINS eine Liste. Die Verknüpfungen sind aufgrund von Programmierfehlern teilweise mit, teilweise ohne den Wurzelknoten gespeichert (nummer_zwei hat den Wert 1 für Wurzel). Nun suche ich eine Möglichkeit, dort, wo genau diese Verknüpfung fehlt, diese nachzutragen, aber nur dort, wo sonst Verknüpfungen existieren.

Mein Versuch war, dies über "SELECT DISTINCT nummer_eins, zeitstempel, nummer_zwei WHERE nummer_zwei <> 1" zu machen - ich nahm an, dass ich dann je einen Datensatz für diejenigen Verknüpfungen bekomme, wo die Wurzel fehlt. Das scheint aber nicht zu stimmen, die Versuche, eine Wurzelverknüpfung hinzuzufügen, scheitern.

Hat jemand eine andere Idee, wie man das hinbekommen könnte?


----------



## Ilja (2. Feb 2006)

ich rall nix... ein ausschnitt der daten (von mir aus verfremdet) und deine konkrete SELECT-Anweisung wären hilfreich


----------



## SamHotte (2. Feb 2006)

Beispieldatensätze:

Tabelle EINS:
1, 17:39, "Spieltag 1"
1, 17:44, "Spieltag 1"
1, 17:57, "Spieltag 1"
2, 17:40, "Spieltag 2"
3, 18:30, "Spieltag 3"

Tabelle ZWEI:
1, "Mannschaften"
2, "Bayern München"
3, "Werder Bremen"
4, "Hamburger SV"
5, "Makaay"
6, "Klose"
7, "van Boyten"

Tabelle REL:
1, 17:39, 1
1, 17:44, 1
1, 17:44, 2
1, 17:44, 3
3, 18:30, 1
3, 18:30, 2

Semantik:
Tabelle EINS hält unterschiedliche Versionen von Tabellenständen (jeweils die mit dem spätesten Zeitstempel ist die aktuelle). Der Primärschlüssel besteht aus den beiden Feldern "nummer_eins" und "zeitstempel".
Tabelle ZWEI hält den Baum, in dem bspw. die Spieler enthalten sind.
Jeder aktive Tabellenstand kann jetzt mit den einzelnen Einträgen aus dem Baum verknüpft werden (z.B. Torschützen oder eingesetzte Spieler).
Jetzt möchte ich wissen, wo bei diesen Verknüpfungen der Eintrag "nummer_zwei ist gleich 1" fehlt, wenn es Verknüpfungen mit dieser Version gibt.

EDIT:
Die SELECT-Anweisung, die _nicht_ funktioniert:
SELECT DISTINCT nummer_eins, zeitstempel, nummer_zwei FROM rel WHERE nummer_zwei <> 1


----------



## KSG9|sebastian (2. Feb 2006)

Ich versteh deine Erklärung absolut nicht, aber falls du die Tabellen verknüpfen willst:

1. nimm den timestamp aus der REL-Tabelle raus und mach es so:

EINS(id, tstamp, text)
ZWEI(id, text)
DREI(einsId, zweiId);

Tabelle EINS: 
1, 17:39, "Spieltag 1" 
1, 17:44, "Spieltag 1" 
1, 17:57, "Spieltag 1" 
2, 17:40, "Spieltag 2" 
3, 18:30, "Spieltag 3" 

Tabelle ZWEI: 
1, "Mannschaften" 
2, "Bayern München" 
3, "Werder Bremen" 
4, "Hamburger SV" 
5, "Makaay" 
6, "Klose" 
7, "van Boyten" 

Tabelle REL: 
1, 1 
1, 1 
1, 2 
1, 3 
3, 1 
3, 2 

SELECT DISTINCT eins.*, zwei.* FROM eins, zwei WHERE eins.id = rel.einsId AND zwei.id = rel.zweiId

Nach Möglichkeit kein select * verwenden sondern halt SELECT eins.id as eid, zwei.id as zid u.s.w.


----------



## SamHotte (2. Feb 2006)

Zeitstempel aus REL rausnehmen geht nicht, sonst kracht es wegen Indexfehler (in deinem Beispiel in Zeile 2). Außerdem brauche ich die Versionen.

Vielleicht nochmal zur Klarstellung: es kommt vor, dass in REL Verknüpfungen stehen (z. B. mit den Knoten 2,4,6), aber die Verknüpfung mit Knoten 1 fehlt. Wenn das der Fall ist, möchte ich sie einfügen, ansonsten nichts tun. Wie finde ich es heraus, wo (also bei welchen Werten aus EINS) ich diese Verknüpfung einfügen muss?


----------



## Ilja (2. Feb 2006)

SELECT DISTINCT t1.nummer_einz FROM rel t1 WHERE nummer_zwei != 1 AND NOT EXISTS (SELECT t2.nummer_einz FROM rel t2 WHERE t2.nummer_zwei = 1 AND t1.nummer_eins = t2.nummer_eins)

Voraussetzung: MySQL > v4.0
bei v3.x gibts kein Subselect


----------



## SamHotte (2. Feb 2006)

Voraussetzung nicht erfüllbar - entweder MS Access oder MS SQL Server :-(


----------



## Ilja (2. Feb 2006)

MS SQL müsste auch subselect unterstützen... oder hast du schon getestet?


----------



## SamHotte (3. Feb 2006)

Konnte ich nicht, da ich bislang die Datenhaltung (leider) mit Access machen muss - es ist ein Prototyp, und meine Testanwender haben nur Office auf dem Rechner :-/

Kennt vielleicht einer 'ne gute Referenz für den SQL-Dialekt von Access? Mit der Hilfe krieg' ich die Krise ...


----------

