我不熟悉外键,但我非常理解这个概念。
我找到了很多关于如何创建/删除它们的文档,但没有找到如何使用它们的文档。我的架构如下。
股票表:
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 :(得分:2)
外键的概念是将一个表中的ID链接到另一个表中唯一ID的lisk。在您的示例中,您有具有唯一ID的唯一部件和可以使用这些部件的产品,因此在您的产品表中,您可以在多行中使用多个部件ID。
外键用于保持数据库中的引用完整性,您可以使用连接来获取所需的数据:
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
答案 1 :(得分: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
其中Product_parts中的productID是Product的外键,partID是Part表中的外键。
答案 2 :(得分: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
首次加入库存和零件表时,请先加一个JOIN 然后再次将此连接的结果连接到零件表。
SQL解析器将使用parts表作为两个单独的表,因此您可以在单行中使用相同的tabe获得两个结果。
答案 3 :(得分: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
答案 4 :(得分: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