我遇到了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;
有人可以帮助我吗?
答案 0 :(得分:1)
首先,快速进行代码审查:
“日期”是一个特殊的词。我建议不要将它用作列标题。对这些日期的类型有一点描述性。 OrderC_date和Forever_cmd_date。或OC_date,FC_date。
您已将“数量”和“Qte”用于数量。始终如一。或者甚至更好,更能描述这些数量。
对于您的副本,请一次删除一个JOIN,直到找出哪一个导致欺骗。我打赌你需要在其中一个表上缩小你的JOIN标准。
=============================================== ============
修改强>
这应该指向正确的方向找到您的副本。
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"?
提示:如果多个供应商拥有相同的产品,您如何确定从哪个供应商处获得产品?