MS Access查询返回重复的行

时间:2016-01-12 10:13:10

标签: sql ms-access

我正在努力解决一个相当简单的问题。但是,由于我的访问和SQL能力水平较低,我的当前项目遇到了障碍。详情如下,并提前感谢您的耐心等待。

我将来自多个表的数据合并到一个包含所有必需字段的大型数据集中。我相信'Axle_and_Application_Table'表的加入方式导致查询返回重复记录。

SELECT [Purchase Order].POST_DT, 
       Format$(Year([POST_DT]),'00') AS YearField, 
       Format$(Month([POST_DT]),'00') AS MonthField, 
       Format$(Day([POST_DT]),'00') AS DayField, 
       DealerLookup.[Vendor Country], 
       [Purchase Order].VEND_ID, 
       DealerLookup.[Vendor Name], 
       DealerLookup.[Vendor Group], 
       DealerLookup.[Dealer type], 
       [Purchase Order].PRCH_DOC_ID, 
       [Purchase Order].JOB_TYPE_DESC, 
       [Purchase Order].CONTRACT_ID, 
       [Purchase Order].SOLD_TO_CUST_ID, 
       [Purchase Order].LICENCE_PLATE_ID, 
       [Purchase Order].VEHICLE_REG_NBR, 
       [Purchase Order].NAME, 
       [Account Type Lookup].[ACCOUNT NAME], 
       [Purchase Order].location1, 
       [Purchase Order].location2, 
       [Purchase Order].MATERIAL, 
       [Purchase Order].MATL_NAME, 
       [Purchase Order].FOS_TYPE_DESCR, 
       [Purchase Order].SRC_MKT_BRAND_NAME, 
       [Corporate Lookup].Type, 
       [Corporate Lookup].[Brand Groups], 
       [RIM Diameter Lookup].RIM, 
       [Purchase Order].QTY, 
       [Purchase Order].Value1, 
       [Account Type Lookup].[CONTRACT TYPE], 
       [Account Type Lookup].[POLICY FITMENT], 
       [PO Exceptions].[Invalid PO], 
       Axle_and_Application_Table.AXLE, 
       Axle_and_Application_Table.APPLICATION, 
       Axle_and_Application_Table.TBU, 
       Axle_and_Application_Table.[Material Type], 
       Axle_and_Application_Table.TBU, 
       IIf([Material Type]="Service","",[CONTRACT_ID] & [AXLE] & [SRC_MKT_BRAND_NAME] & Replace([FOS_TYPE_DESCR],"Tires","")) AS PID 
FROM ((((([Purchase Order] 
LEFT JOIN DealerLookup ON [Purchase Order].VEND_ID = DealerLookup.[Vendor No]) 
LEFT JOIN [Corporate Lookup] ON [Purchase Order].SRC_MKT_BRAND_NAME = [Corporate Lookup].[BRAND_NAME]) 
LEFT JOIN [Account Type Lookup] ON [Purchase Order].SOLD_TO_CUST_ID = [Account Type Lookup].BILLING) 
LEFT JOIN [PO Exceptions] ON [Purchase Order].PRCH_DOC_ID = [PO Exceptions].[PO Number]) 
LEFT JOIN [RIM Diameter Lookup] ON [Purchase Order].MATERIAL = [RIM Diameter Lookup].MATERIAL) 
LEFT JOIN Axle_and_Application_Table ON [Purchase Order].MATERIAL = Axle_and_Application_Table.Material 
WHERE (((Format$(Year([POST_DT]),'00'))="2015"));

表结构(Axle_and_Application_Table):

Material | Axle    | Application | TBU   | Material Type
-------------------------------------------------------------
12345    | Steer   | Regional    | Truck | Tyre
12346    | Drive   | Municipal   | Truck | Tyre
12347    | Trailer | Regional    | Truck | Tyre

Table Relations Pic...

我是Access和SQL的新手,并且非常感谢我需要在这方面大力发展我的技能来尝试解决这个问题!!

您可以提供的任何帮助或指导都非常感谢。

再次感谢。

1 个答案:

答案 0 :(得分:1)

我们无法知道哪些连接表有多个匹配记录,因此会在结果中创建重复记录。

您可以仔细查看结果:比较2个重复记录,是否有任何不同的列?如果是,您已找到违规表。

或者:在查询设计中,逐个删除连接的表,然后检查结果。一旦没有更多的重复记录,最后删除的表就是罪魁祸首。

然后:找到一个更好的连接标准,或者为该表添加一个WHERE子句,这样它只返回一个记录。

//在您的关系窗口中,没有一个表似乎有主键?

- >是的,这确实是一个问题。关系数据库依赖于主键来定义表之间的关系。

Axle_and_Application_Table中,Material似乎是主键的明显选择,因为它在联接中使用。
但如果它是创建重复项的那个,那么Axle_and_Application_Table.Material

中必须有重复项

这可能是错误,或者您需要额外的标准才能将表格加入Purchase Order

但在您执行任何操作之前,您应该分析数据库并设置或添加适当的主键,例如,在这里:Add or change a table’s primary key in Access