2010-12-13 10 views
1

私は、create文とinsert文を使用してデータを取り込んだデータベースを持っています。 WHERE句を持つSELECT文を記述しました。私が遭遇している問題は、私がこの声明を実行すると、データのいくつかが私が理解できない何らかの理由で繰り返されていることがわかったということです。Where句文データの繰り返し

これは私が実行しようとしている文です。

SELECT Customer_Contact, Customer.CustomerID, Ord.OrderID,ItemOrdered.BeltLength,ItemOrdered.Colour, 
ItemOrdered.Quantity,Design.DesignStyle 
    FROM Customer, Ord, ItemOrdered,Design 
    WHERE Customer.CustomerID = Ord.CustomerID 
    and Customer.Customer_Contact = 'John Daley' 
and Design.DesignStyle ='Flat-Engraved'; 

上記の文を作成するために使用したすべての関連コードが表示されます。 [データベース・コード] [1]

私は、次の形式でレイアウトされています:

SELECT Customer_Contact, Customer.CustomerID, Ord.OrderID,ItemOrdered.BeltLength,ItemOrdered.Colour, 
ItemOrdered.Quantity,Design.DesignStyle 
FROM Customer, Ord, ItemOrdered,Design 
WHERE Customer.CustomerID = Ord.CustomerID and 
ItemOrdered.OrderID = Ord.OrderID 
and Customer.Customer_Contact = 'John Daley' and 
Design.DesignStyle ='Flat-Engraved'; 

これは動作しますが、しかし、ときに私:

CREATE STATEMENT 
INSERT INTO STATEMENT 

句とは、次のようになりますどこに拡大ステートメントを実行すると、まったく同じ3つのレコードが表示されます。

SELECT Customer.Customer_Contact, 
     Customer.CustomerID, 
     Ord.OrderID, 
     ItemOrdered.BeltLength, 
     ItemOrdered.Colour, 
     ItemOrdered.Quantity, 
     Design.DesignStyle 
    FROM Customer, 
     Ord, 
     ItemOrdered, 
     BeltID 
     Design 
WHERE Customer.CustomerID  = Ord.CustomerID 
    AND Ord.OrderID    = ItemOrdered.OrderID 
    AND Customer.Customer_Contact = 'John Daley' 
    AND Design.DesignStyle  ='Flat-Engraved' 
    AND BeltID.DesignID   = Design.DesignID; 

上記の陳述は私に無効な識別子エラーを与えていますが、私はそれを理解できないようです。

答えて

1

あなたはDesignテーブルとItemOrderedテーブルから何かを選択したいと思われますが、あなたはそれらを結合に含めません。

ItemOrderedテーブルとDesignテーブルをCustomerテーブルまたはCustomer_ContractテーブルにリンクするWhere句(andステートメント)を展開する必要があります。

+0

where節が展開され、上記のようになりました。私はフィールドを編集しました。 –

+0

user532339:参加しているデザインテーブルはどうですか?キーは他のテーブルの外部キーとして存在しません。 –

+0

デザインテーブルが結合されます。それはBeltIDに結合され、次のリンクはそれらがどのように結合されているかを示しています。 http://pastebin.com/rrCr9M46 –

3

あなたのWHERE句はかなりゆるいようです。 Customer to Ordへの参加はかなり強いようですが、ItemOrderedはWHERE句にも現れず、おそらくCartesian Joinを引き起こしています。

+0

WHERE句にItemOrderedを含めることをお勧めしますか? –

2

ここで作成ステートメントを見ると、ほとんどの結合をどのように作成するかがわかります。 1は、一般的には

SELECT 
    Customer_Contact, 
    Customer.CustomerID, 
    Ord.OrderID, 
    ItemOrdered.BeltLength, 
    ItemOrdered.Colour, 
    ItemOrdered.Quantity --, 
--Design.DesignStyle 
    FROM 
     Customer, 
     INNER JOIN Ord 
     ON Customer.CustomerID = Ord.CustomerID 
     INNER JOIN ItemOrdered 
     ON ord.OrderID = ItemOrderd.OrderID 
     -- INNER JOIN design 
    WHERE 
      Customer.Customer_Contact = 'John Daley' 


--and Design.DesignStyle ='Flat-Engraved'; 
0

クエリを完了するために、より多くの情報が必要になりますので、デザインのテーブルがしかし、他のテーブルのいずれかによって参照されていないようですあなたが一緒にNのテーブルを結合している場合、あなたはで提供したいです少なくともN-1個の結合条件。 4つのテーブルを結合しているので、通常は少なくとも3つの結合条件が必要です。 DesignStyle列がユニークであることが意図されている場合(リンク先のDDLからは不明です)、これが機能するはずです。

SELECT Customer.Customer_Contact, 
     Customer.CustomerID, 
     Ord.OrderID, 
     ItemOrdered.BeltLength, 
     ItemOrdered.Colour, 
     ItemOrdered.Quantity, 
     Design.DesignStyle 
    FROM Customer, 
     Ord, 
     ItemOrdered, 
     Design 
WHERE Customer.CustomerID  = Ord.CustomerID 
    AND Ord.OrderID    = ItemOrdered.OrderID 
    AND Customer.Customer_Contact = 'John Daley' 
    AND Design.DesignStyle  ='Flat-Engraved'; 

通常は、しかし、あなたのデータモデルは、ItemとOrderテーブル間の交点になるデザインのテーブルとItemOrderedテーブルへの外部キーを持っていたアイテムのテーブルのいくつかの並べ替えを持っているでしょう。それは結合をはるかに賢明にするでしょう。

+0

あなたの言っていることを理解していますが、私の参加とあなたの参加は同じことをしています。私はまだこの問題に遭遇しています。次のリンクは、http:// imgurが発生している問題を表示します。com/UjrbC –

+0

質問を編集して、リンク先の情報を含めることができますか?ファイアウォールの背後からそのURLにアクセスできません。 –

+0

私はBeltIDテーブルの外来キーであるDesignIDを持っていますが、次の文が構造化されています。 ORA-00904: "BELTID"。 "DESIGNID":無効な識別子です。私が私の声明でそれを特定したら、それはどのように正確に無効になりますか? –