2012-04-09 2 views
0

Скажем, у меня есть таблицыКак я могу принимать значения из одной таблицы, исходя из значений в другой?

Parts 
    PartID (Primary Key) 
    Part Name 

    Orders 
    OrderID (Primary Key) 
    CustID (Foreign Key) 

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

Если бы я хотел, чтобы получить часть имени для нескольких PartIDs из OrderDetails, как бы я идти об этом? Я бы использовал две таблицы данных? Я смущен, так как не вижу эффективного способа сделать это. Единственное, что я могу думать о том, чтобы создать DataTable с SQL:

SELECT * FROM OrderDetails WHERE OrderID=OrderID; 

, а затем, возможно, использовать для цикла, чтобы принять каждый PartID, создать еще один объект DataTable, чтобы найти PartName для этого, а затем дать это к переменная. Может потребоваться до 10 PartID для поиска, и я не хочу иметь такие переменные, как PartID1 PartID2 и т. Д.

Надеюсь, я смог эффективно передать свою проблему.

Благодаря

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

Я немного смущен, это звучит как простой запрос? Выберите od.OrderDetailsID, p.Part_Name, od.Quantity, od.OrderID From OrderDetails od, Parts p Где p.partid = od.partid, возможно, даже просто базовый вид может обрабатывать. –

+0

@mike - Да, я бы пошел на что-то подобное, хотя я бы предпочел указать соединение. Но что случилось с «Ордерами»? Это выглядит как неприятная де-нормализация. –

+0

Вы не захотите хранить partid в заказах, так как это от одного до многих realtionship. – HLGEM

ответ

1

Я думаю, что вы ищете join. Синтаксис немного зависит от того, какой SQL вы используете, однако в общем будет выглядеть примерно так:

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

Насколько я понимаю, это будет создавать временную таблицу, состоящую из полей обеих таблиц вместе взятые. Теоретически он создавал бы одну запись в комбинированной таблице для каждой возможной комбинации записей из двух исходных таблиц. Чтобы сократить это до разумного числа, вы вводите отношение p.PartID = o.PartID, которое сводит его только к тем комбинациям, которые примерно равны PartID.

Внутреннее соединение означает, что он будет выбирать только из заказов, у которых есть идентификатор детали, и только части, которые находятся в заказе. LEFT и RIGHT join могут делать противоположности - выбирать все части, даже если они не находятся в порядке (слева) или во всех заказах, даже если у них нет частей (справа).

W3Schools имеет некоторые больше присоединяется здесь: http://www.w3schools.com/sql/sql_join.asp

+2

-1 для использования SQl антипаттерн неявных объединений, особенно для тех, кто явно их не понимает. – HLGEM

+0

Я сделал некоторые изменения и отредактировал сообщение. Пожалуйста, поправьте меня, если я даю неверную информацию, я не могу сказать, что я эксперт по вопросам присоединения. – Armatus

+0

INNER JOIN работал как шарм и благодарит вас за предоставление учебных ресурсов! – Paul

0

что-то вроде:

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 

Лично хотя я бы хранить partname и цены в деталях заказа, чтобы иметь историческую reocrd того, что было на самом деле заказал , В конце концов, вы бы не хотели, чтобы исторический порядок изменился, если цена поднялась, например.

Смежные вопросы