Sql请求返回错误结果

时间:2017-09-19 13:59:18

标签: sql sql-server

我遇到了SQL请求或我的数据库结构问题。我想有供应商/客户数据库。由于订购的价格产品和销售的产品可以改变,我想在每个订单/销售上保持历史记录,以便在未来的统计数据中创建它们。我正处于项目的开始阶段并使用6个简单的表格:

    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请求的结果为客户创建了额外的结果。

示例

我创建了2个供应商订单(S1和S2),其中包含具有不同供应商价格的相同产品ID(P1)。我创建了一个客户订单,我选择从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;

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

首先,快速进行代码审查:

  1. “日期”是一个特殊的词。我建议不要将它用作列标题。对这些日期的类型有一点描述性。 OrderC_date和Forever_cmd_date。或OC_date,FC_date。

  2. 您已将“数量”和“Qte”用于数量。始终如一。或者甚至更好,更能描述这些数量。

  3. 对于您的副本,请一次删除一个JOIN,直到找出哪一个导致欺骗。我打赌你需要在其中一个表上缩小你的JOIN标准。

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

    修改

    这应该指向正确的方向找到您的副本。

    SQL Fiddle

    MS SQL Server 2014架构设置

    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)
    ;
    

    查询1

    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

    | For_ID_CMD |    Name | PUHA |
    |------------|---------|------|
    |          1 | Widget1 |    2 |
    |          1 | Widget2 |   12 |  << Why did this "duplicate"?
    |          2 | Widget2 |   20 |  << Why did this "duplicate"?
    

    提示:如果多个供应商拥有相同的产品,您如何确定从哪个供应商处获得产品?