2012-04-26 2 views
0

Я новичок в внешнем ключе, но я понимаю концепцию очень хорошо.Использование внешнего ключа

Я нашел много документации о том, как их создавать и удалять, но не о том, как их использовать. Моя схема выглядит следующим образом.

со стола:

 
PartID | Model | Type | Vendor 
------------------------------ 
1  | DDr2 | RAM | shop1 
2  | DDr3 | RAM | shop1 
3  | WD1 | HDD | shop2 
4  | WD2 | HDD | shop2 

Затем продукт Таблица

 
ProdID | Name | PartID1 | PartID2 ... 
1  | PC1 | 1  | 2 
2  | PC1 | 3  | 4 

Как использовать select, чтобы получить

| PC1 | DDr2 | DDR3 | 
| PC1 | WD1 | WD2 | 

с PartID2 и PartID3 внешний ключ, связанный с PartID первичного ключа?

+0

Вы можете разместить свой SQL для определения таблицы? – ControlAltDel

+1

сколько частей (частьId1, частьID2, ...) есть? не лучше ли вы с таблицей отношений «многие ко многим» вместо столбцов нескольких частей? – jambriz

ответ

0
SELECT s1.Name, p1.Model, p2.Model FROM stock st 
    INNER JOIN product p1 
     ON st.PartID1 = p1.PartID1 
      INNER JOIN product p2 
      ON st.PartID2 = p2.PartID1 

Возьмите один РЕГИСТРИРУЙТЕСЬ в то время первым присоединиться к акции и части таблицы затем снова присоединиться к результату этого присоединиться к таблице частей.

SQL-парсер будет использовать таблицу деталей как две отдельные таблицы, так что вы можете иметь два результата с одного и того же табу в одной строке.

0

вы можете присоединиться к таблице более одного раза в одном и том же заявлении sql. в этом случае вам нужно дважды присоединиться к вашей стоковой таблице, чтобы получить название каждой части вашего продукта.

SELECT pr.ProdID, s1.Model, s2.Model 
FROM Product pr, Stock s1, Stock s2 
WHERE pr.PartID1 = s1.PartID 
AND pr.PartID2 = s2.PartID 
0

Использование LEFT OUTER JOIN означает, что продукт все равно будет возвращено событие, если Part1ID или Part2ID значения установлены в NULL.

SELECT   P.Name, 
       S1.Model, 
       S2.Model 
FROM   Product P 
LEFT OUTER JOIN Stock S1 ON P.PartID1 = S1.PartID 
INNER JOIN  Stock S2 ON P.PartID2 = S2.PartID 
+0

Да, что хорошо работает с 2 внешними: SELECT P.Name, P.PartType, S1.Model AS exp1, S2.Model AS Exp2 ОТ ПРОДУКТА AS P LEFT OUTER JOIN Части AS S1 ON P.PartID1 = S1.PartID LEFT OUTER JOIN Части AS S2 ON P.PartID2 = S2.PartID ГДЕ (P.Name = 'p1') – Lambda

1

Короткий ответ вы могли бы сделать

select p.name, a.model as part1, b.model as part2, c.model as part3 
    from product p, stock a, stock b, stock c 
    where p.partid1 = a.partid and p.partid2 = b.partid and p.partid3 = c.partid 

Чем дольше ответ, что это действительно не хороший дизайн таблицы для того, что вы пытаетесь сделать. Он предполагает, что у вас всегда есть фиксированное количество частей для любого предмета (или, по крайней мере, не более определенного фиксированного числа). Лучше дизайн будет:

Part Table: 
partID | model | type | vendor 

Product Table: 
productID | name 

Product_Parts Table: 
productID | partID 

где ProductID в Product_parts внешний ключ в продукт и PartID внешний ключ в таблицу части.

+0

Это хороший совет, всегда лучше планировать заранее. Если по какой-либо причине вы добавите больше деталей, то в соответствии с предлагаемой схемой вы не сможете переписать свои SQL-запросы. – weenoid

+0

Да, я согласен, но здесь partID2 является альтернативой PartID1, и каждая часть строки в таблице продуктов - это один элемент в списке деталей. Список деталей продукта продукта затем выполняется WHERE product.name = 'pc1 " – Lambda

2

Концепция внешних ключей заключается в том, чтобы связать идентификаторы в одной таблице с листом уникальных идентификаторов в другом. В вашем примере у вас есть уникальные части с уникальными идентификаторами и продуктами, которые могут использовать эти части, поэтому в вашей таблице продуктов вы можете использовать несколько идентификаторов деталей в нескольких строках.

Внешние ключи используются для хранения ссылочной целостности в базе данных, вы можете использовать присоединяется, чтобы получить данные, которые вы хотите:

SELECT A.NAME, 
     B.Model, 
     C.Model 
FROM PRODUCTS A 
     INNER JOIN PARTS B ON B.PARTID1 = A.PARTID 
     INNER JOIN PARTS C ON C.PARTID1 = A.PARTID 
WHERE A.PRODID = 1  
Смежные вопросы