2012-04-26 15 views
0

私は外部キーを初めて使っていますが、私はそのコンセプトをとてもよく理解しています。外部キーの使用

私はそれらを作成/削除する方法については多くの文書を見つけましたが、それらを使用する方法はわかりませんでした。私のスキーマは以下の通りです。

在庫表:

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

その後、製品の表Iは、PartID主キーにリンクされているPartID2PartID3外部キーで

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

を取得するためにselectを使用するにはどうすればよい

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

+0

あなたはテーブル定義のためのあなたのSQLを投稿することができますか? – ControlAltDel

+1

パート(partId1、partID2、...)はいくつありますか?複数の部分列ではなく、多対多の関係表を使用する方がよいでしょうか? – 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 

1は、この部品表に参加した結果を参加再び株式や部品表 に参加する最初の時点で登録しよください。

SQLパーサは、2つの別個のテーブルとしてパーツテーブルを使用します。したがって、同じ行の2つの結果を1つの行に含めることができます。

0

同じSQL文で複数回テーブルに参加できます。この場合、在庫表に2回参加する必要があります.1回は製品内の各部品の名前を取得するためです。 LEFT OUTER JOINを使用して

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

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 LEFT OUTER JOIN 部品AS S1 ON P.PartID1 = S1。パーツID LEFT OUTER JOIN パーツAS S2 ON P.PartID2 = S2.PartID WHERE(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 

を行う可能性がある長い答えは、これは本当にあなたがやろうとしている何のために良いテーブル設計ではないということです。これは、あなたが常に項目の固定数を(または少なくとも固定数を超えて)持っていることを前提としています。優れたデザインは、次のようになります。

Product_parts中のproductIDは、製品への外部キーであるとpartIDパートテーブルへの外部キーである
Part Table: 
partID | model | type | vendor 

Product Table: 
productID | name 

Product_Parts Table: 
productID | partID 

+0

これは良いアドバイスです。何らかの理由で将来的に多くの部品を追加すると、提案されたスキーマに従ってSQLクエリを書き直す必要がなくなります。 – weenoid

+0

はい、同意しますが、ここではpartID2がPartID1の代替品であり、製品表の各部品ラインは部品リストの1つの項目です。製品の製品部品リストは、where product.name = 'pc1' – Lambda

2

「外部キー」の概念は、あるテーブルの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