2017-09-19 12 views
1

私はSQL要求または私のデータベース構造に問題があります。私はサプライヤー/顧客データベースを持っていたいと思います。価格の製品を注文し、変更することができる製品を販売したように、私は彼らの将来の統計に作成するために、各注文/売上に歴史を維持したいと思います。私は私のプロジェクトの先頭にだと6つの簡単な表を使用して:私は別のサプライヤーのご注文で同様の製品を持っているまで、すべてが正常に動作しているSQL要求の戻り誤った結果

Client  |  OrderC  | OrderDetail 
-----------------+------------------+-------------------------------------- 
Client_ID (Pk) | Order_ID (Pk) | OrderD_ID (Pk) 
Name    | Client_ID (Fk) | Order_ID (Fk) 
       | date   | Product_ID (Fk) 
       |     | Qty 
       |     | PU_Vte (sales price) 
       |     | For_Cmd_ID (Fk from For_ID-Cmd table Forever_cmd) 
_________________|__________________|_____________________________________ 


       |(supplier database)| (detail of supplier order) 
    Product  | Forever_cmd | For_Ord_Detail 
----------------+-------------------+---------------------------------------------------- 
Product_ID (Pk) | For_ID_CMD (Pk) | For_Det_Id (Pk) 
Name   |  date   |ID_cmd_For (Fk from For_ID-CMD on Forever_cmd table) 
       |     |Product_ID (Fk source Product_ID on Product table) 
       |     | Qte (= quantity) 
       |     | PUHA (= supplier price) 

。私のSQLリクエストの結果は、顧客のための余分な結果を作成します。

Iは、異なる供給業者価格で同じ製品ID(P1)を含む2つのサプライヤ注文(S1およびS2)を作成します。私は顧客注文を作成し、S1から商品P1を販売することを選択します。

私は製品とクライアントでビューを取得すると、サプライヤーの順序からそれらを追跡するためにクエリを実行すると、結果は顧客に、すべてのサプライヤーの注文からすべての同様の製品を追加します。顧客が注文した製品だけではなく、

それは私のクエリまたはデータベースの一貫性のある場合、私は知りません。ここで

は私のSQL要求です:

SELECT C.Name, 
     O.order_id, 
     F.For_ID_CMD, 
     P.Name, 
     D.Qte, 
     D.PU_Vte, 
     X.PUHA 
FROM Client AS C 
    JOIN OrderC O ON C.Client_ID = O.Client_ID 
    JOIN OrderDetail D ON O.Order_ID = D.Order_ID 
    JOIN For_Ord_Detail X ON D.Product_ID = X.Product_ID 
    JOIN Forever_Cmd F ON F.For_ID_CMD = X.ID_cmd_For 
    JOIN Product P ON D.Product_ID = P.Product_ID; 

誰かが私を助けていただけますか?

+0

サンプルテーブルのデータと予想される結果を追加します。 (フォーマットされていないテキストとして、画像ではありません) – jarlh

+0

SQLの味とバージョンは? – Shawn

+0

こんにちは、私はSQL ExpressとSQL管理スタジオを使用しています17.2 –

答えて

1

まず、迅速なコードレビュー:

  1. "日" は、特別な言葉です。列ヘッダーとして使用しないことをお勧めします。これらの日付の種類について少し詳しく説明してください。 OrderC_dateおよびForever_cmd_date。またはOC_date、FC_date。

  2. 数量に「Qty」と「Qte」の両方を使用しました。一貫してください。あるいは、それらの量が何であるかをより具体的に説明してください。

重複している場合は、重複の原因となっているものを特定するまで、一度に1つずつJOINを削除します。私はあなたがそれらのテーブルの1つであなたのJOIN基準を絞り込む必要があると確信しています。

============================================== =============

EDIT

これはあなたの重複を見つけるために、正しい方向を指している必要があります。

SQL Fiddle

MS SQL Serverの2014スキーマのセットアップ:1

CREATE TABLE Product (Product_ID int, Name varchar(20)) ; 
INSERT INTO Product (Product_ID, Name) 
VALUES 
    (1, 'Widget1') 
    , (2, 'Widget2') 
; 

CREATE TABLE Forever_cmd (For_ID_CMD int, [date] date) ; 
INSERT INTO Forever_cmd (For_ID_Cmd, [date]) /* Why a date? */ 
VALUES (1,'10/26/1985'), (2,'6/27/2012'); 

CREATE TABLE For_Ord_Detail (For_Det_Id int, ID_cmd_For int, Product_ID int, Qte int, PUHA decimal(10,2)) ; 
INSERT INTO For_Ord_Detail (For_Det_Id, ID_cmd_For, Product_ID, Qte, PUHA) 
VALUES 
    (1,1,1,10,2.00) 
    , (2,1,2,10,12.00) 
    , (3,2,2,20,20.00) 
; 

問合せ:

SELECT F.For_ID_CMD, P.Name, X.PUHA 
FROM Product P 
LEFT OUTER JOIN For_Ord_Detail X ON P.Product_ID = X.Product_ID <<<<< 
LEFT OUTER JOIN Forever_Cmd F ON X.ID_cmd_For = F.For_ID_CMD 

Results

ヒント:複数のサプライヤが同じ製品を持っている場合、どのサプライヤから製品を購入するかをどのように決定しますか?

関連する問題