2012-04-09 18 views
0

Sagen, ich habe TabellenWie kann ich Werte aus einer Tabelle basierend auf den Werten in einer anderen Tabelle übernehmen?

Parts 
    PartID (Primary Key) 
    Part Name 

    Orders 
    OrderID (Primary Key) 
    CustID (Foreign Key) 

    OrderDetails 
    OrderDetailsID (Primary Key) 
    PartID (Foreign Key) 
    Quantity 
    OrderID (Foreign Key) 

Wenn ich für mehrere PartIDs von Orderdetails, wie wäre dies zu tun würde ich gehen, um Teilname gesucht? Würde ich zwei DataTables verwenden? Ich bin verwirrt, weil ich keinen effizienten Weg sehe, dies zu tun. Das einzige, was ich denken kann, ist eine Datentabelle mit SQL zu erstellen:

SELECT * FROM OrderDetails WHERE OrderID=OrderID; 

und dann vielleicht ein For-Schleife verwenden, um jede PartID zu nehmen, ein weitere Datentabelle erstellen, den Partnamen für das zu finden, und dann dies eine geben Variable. Es könnte bis zu 10 PartIDs geben, und ich möchte keine Variablen wie PartID1 PartID2 usw. haben.

Ich hoffe, ich konnte mein Problem effektiv vermitteln.

Dank

EDIT:

SQLCmd = "SELECT tblParts.PartID, tblParts.PartName, tblOrderDetails.Quantity, OrderDetails.OrderID FROM tblOrderDetails, tblParts " 
    SQLCmd = SQLCmd & "WHERE tblParts.PartID = OrderDetails.PartID AND OrderID=" & OrderID & ";" 
+0

Ich bin ein bisschen verwirrt, das klingt wie eine einfache Abfrage? Wählen Sie od.OrderDetailsID, p.Part_Name, od.Quantity, od.OrderID aus OrderDetails od, Teile p Wo p.partid = od.partid möglicherweise sogar nur eine einfache Ansicht verarbeiten könnte. –

+0

@mike - Ja, ich würde mich für so etwas entscheiden, obwohl ich es vorziehen würde, den Join anzugeben. Aber was ist mit "Bestellungen" los? Das sieht nach einer fiesen Entnormalisierung aus. –

+0

Sie möchten nicht partiid in Bestellungen speichern, da es eine Eins-zu-viele-Beziehung ist. – HLGEM

Antwort

1

Ich glaube, Sie für join suchen. Die Syntax hängt etwas ab, welche Art von SQL Sie verwenden, aber es in der Regel so etwas wie folgt aussehen:

SELECT `Part Name` 
FROM Parts p 
INNER JOIN OrderDetails o ON p.PartID = o.PartID 
WHERE o.OrderDetailsID = ...; 

Soweit ich es verstehe, wird dies eine temporäre Tabelle erstellen, die aus den Bereichen der beiden Tabellen besteht kombiniert. In der Theorie würde es einen Datensatz in der kombinierten Tabelle für jede mögliche Kombination von Datensätzen aus den zwei ursprünglichen Tabellen erstellen. Um dies auf eine vernünftige Zahl herunterzufahren, führen Sie die Beziehung p.PartID = o.PartID ein, die sie auf nur die Kombinationen reduziert, die etwa gleich PartID sind.

Innere Verbindung bedeutet, dass nur Aufträge ausgewählt werden, denen eine Teile-ID zugeordnet ist und nur Teile, die sich in einer Bestellung befinden. LEFT und RIGHT Join sind in der Lage, das Gegenteil zu tun - wählen Sie alle Teile aus, auch wenn sie nicht in einer Reihenfolge (links) oder alle Bestellungen sind, auch wenn sie keine Teile (rechts) haben.

W3Schools hat einig mehr schließt sich hier: http://www.w3schools.com/sql/sql_join.asp

+2

-1 für die Verwendung von SQl Antipattern von impliziten Joins vor allem für jemanden, der sie eindeutig nicht versteht. – HLGEM

+0

Ich habe eine Revision gemacht und den Post bearbeitet. Bitte korrigieren Sie mich, wenn ich falsche Informationen gebe, kann ich nicht sagen, dass ich ein Experte bin, um mich selbst zu verbinden. – Armatus

+0

INNER JOIN arbeitete wie ein Charme und danke Ihnen für die Bereitstellung von Lernressourcen! – Paul

0

so etwas wie:

SELECT o.orderID, p.partname, od.quality 
FROM orders o 
INNER JOIN orderdetails od ON o.orderID = od.orderID 
INNER JOIN parts p ON od.partID = p.partID 

Persönlich obwohl ich den Teilenamen und Preis in den Auftragsdaten speichern würde eine historische Reocrd zu haben, was tatsächlich bestellt . Schließlich möchte man nicht, dass sich die historische Reihenfolge ändert, wenn der Preis zum Beispiel steigt.

Verwandte Themen