0

我是外键新手,但我非常了解这个概念。

我找到了很多关于如何创建/删除它们的文档,但没有找到如何使用它们。我的架构如下。

库存表:

零件编号 | 型号 | 类型 | 小贩
------------------------------
1 | DDR2 | 内存 | 店铺1
2 | DDR3 | 内存 | 店铺1
3 | WD1 | 硬盘 | 店铺2
4 | WD2 | 硬盘 | 店铺2

然后产品表

产品编号 | 姓名 | 第 1 部分 | 第 2 部分 ...
1 | PC1 | 1 | 2
2 | PC1 | 3 | 4

我如何使用select获得

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

PartID2PartID3键链接到PartID主键?

4

5 回答 5

3

外键的概念是将一个表中的 ID 链接到另一个表中的唯一 ID 列表。在您的示例中,您有具有唯一 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     
于 2012-04-26T16:33:43.957 回答
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 表的外键。

于 2012-04-26T16:30:20.893 回答
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 解析器将使用部分表作为两个单独的表,因此您可以在单行中从同一个表中获得两个结果。

于 2012-04-26T16:26:06.753 回答
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
于 2012-04-26T16:27:14.147 回答
0

使用 a表示如果or值设置为 NULL LEFT OUTER JOIN,产品仍将返回事件。Part1IDPart2ID

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
于 2012-04-26T16:28:26.097 回答