2009-03-06 20 views
0

Ich habe ein drei Tabellen:mit einer Abfrage Brauchen Sie Hilfe (Joins)

Check Tabelle hält, was ich einen Link zu einem Besitzer Tisch zu bekommen brauchen
Receipts Tabelle
Besitzer Tisch weiß, hält was Scheckbuch es ist verbunden mit

Ich muss die Scheckbücher nur erhalten, wenn es Zeilen in den Quittungen gibt, die mit ihm verbunden sind (durch die Besitzertabelle). Ich weiß nicht genau, wie man das macht, und es scheint irgendwie zirkulär. Dies ist, was ich versucht habe: „ nicht gebunden werden kann‚

SELECT chk.ID, chk.Description FROM tblCheckbook chk 
LEFT JOIN tblOwner o 
ON r.OwnerID = o.ID 
INNER JOIN tblCashReceipts r 
ON chk.ID = o.CheckbookID 

aber SQL Server beklagt, dass ‘Der mehrteilige Bezeichner“ r.OwnerID
Was muss ich tun, damit dies funktioniert?

+0

Wissen Belege, zu welchem ​​Scheckbuch sie gehören? –

+0

Nein, nur welcher Besitzer gehören sie, und der Besitzer kennt sein/ihr Scheckbuch – Malfist

Antwort

1

Jedes beitreten hat eine on Klausel, die die Beziehung beschreibt. Sie müssen nur die Relationen mit den richtigen Joins verknüpfen.

Es hat keinen Sinn, hier einen linken Join zu verwenden, da Sie im zweiten Schritt einen inneren Join verwenden. Das verursacht nur einen größeren Satz für die Datenbank, um das gleiche Ergebnis zu erzielen.

select c.ID, c.Description 
from tblCheckBook c 
inner join tlbOwner o on o.CheckbookID = c.ID 
inner join tblCashReceipts r on r.OwnerID = o.ID 
2

An dem Punkt, an dem Sie den LINKEN JOIN ausführen, wurde die Definition von r (tblCashReceipts) noch nicht gefunden. Sie werden wahrscheinlich so etwas wollen:

SELECT chk.ID, chk.Description FROM tblCheckbook chk 
LEFT JOIN tblOwner o 
ON chk.ID = o.CheckbookID 
INNER JOIN tblCashReceipts r 
ON o.ID = r.OwnerID 
0

Wissen Belege, zu welchem ​​Scheckheft sie gehören?

Join Scheckhefte über die Quittentabelle.

Besitzer -> Einnahmen -> Check

+0

Sie kennen nur ihren Besitzer, der Besitzer kennt sein/ihr Scheckbuch – Malfist

+0

Das sollte sein: Quittungen -> Besitzer -> Scheckheft (oder in umgekehrter Richtung). – Guffa

1

Ich denke, Sie sind fast da, Sie haben nur Ihre Join-Bedingungen umgeschalten. Versuchen Sie folgendes:

SELECT chk.ID, chk.Description FROM tblCheckbook chk 
LEFT JOIN tblOwner o ON o.CheckbookID = chk.ID 
INNER JOIN tblCashReceipts r ON r.OwnerID = o.ID 

Oder:

SELECT chk.ID, chk.Description FROM tblCheckbook chk 
LEFT JOIN tblOwner o ON o.CheckbookID = chk.ID 
LEFT JOIN tblCashReceipts r ON r.OwnerID = o.ID 
WHERE r.OwnerID IS NOT NULL 

Was hapens, wenn es mehrere reciepts für den gleichen Besitzer sind? Mit dieser Abfrage würden Sie für jeden Empfang ein Scheckheft zurückgeben, das möglicherweise Ihren Vorstellungen entspricht, aber nicht so klingt. Vielleicht möchtest du auch dort eine DISTINCT werfen.

+0

+1, Danke, ich brauchte eine DISTINCT – Malfist