【问题标题】:Join table query returns multiple results from right table连接表查询从右表返回多个结果
【发布时间】:2016-09-22 14:22:27
【问题描述】:

我是新手,我已经在 GUI 中提取了一个查询。

我有一个加入设置,所以所有抱怨的客户都在左表中,所有完成的工作都在右表中。

两个表都有客户参考号,所以我根据这个加入了。

在我们进行任何工作之前,客户可能会抱怨,因此该表是左联接。

我遇到的问题是一个客户可能有多个工作项,所以当我创建连接时,投诉表中的每一行都会被多次返回,如果他们执行了多个工作项。

我需要在联接中添加一些逻辑,以便它只为每个投诉带回一个工作项。如果存在多个工作项,则希望查询返回工作项,其日期最接近投诉日期,但绝不会在投诉日期之后。

如果投诉没有在它之前发生的工作项,我仍然希望显示投诉但包含来自工作项的数据。

我只知道如何使用设计器 GUI,但 SQL 现在看起来像这样:

    SELECT DISTINCT [CEAR326 Master Data fo access1].ID, 
    ReportingCategory.ReportingCategory, 
    [CEAR326 Master Data fo access1].Category, 
    [CEAR326 Master Data fo access1].[Sub Category], 
    [CEAR326 Master Data fo access1].[Contact Partner], 
    main_Tbl_ServiceOrder.ServiceProduct, SOType.SOType, 
    Format([Actual Date From],"mmm-yy") AS [Date], 
    [CEAR326 Master Data fo access1].[Actual Date From],
    main_Tbl_ServiceOrder.BasicStartDate, 
    [CEAR326 Master Data fo access1].Smart_Flag

    FROM (([CEAR326 Master Data fo access1] 
    LEFT JOIN main_Tbl_ServiceOrder ON [CEAR326 Master Data fo access1].[Contact Partner] = main_Tbl_ServiceOrder.BusinessPartnerNumber) 
    LEFT JOIN ReportingCategory ON [CEAR326 Master Data fo access1].Category = ReportingCategory.Category) LEFT JOIN SOType ON main_Tbl_ServiceOrder.ServiceProduct = SOType.ServiceOrder

    WHERE (((main_Tbl_ServiceOrder.BasicStartDate)<="actual Date from" Or (main_Tbl_ServiceOrder.BasicStartDate)="0" Or (main_Tbl_ServiceOrder.BasicStartDate) Is Null))


    ORDER BY [CEAR326 Master Data fo access1].[Contact Partner], main_Tbl_ServiceOrder.BasicStartDate;

我相信 Select distinct 没有按要求工作,因为这条线

main_Tbl_ServiceOrder.ServiceProduct, SOType.SOType, 

这是我希望我的 where 语句出现的地方,并通过查看与 CEAR [实际日期自] 日期相关的服务订单日期来选择相关服务订单。

我还认为,如果当前的 WHERE 语句返回多个服务订单,如果它们发生在 CEAR 之前,它们就会出现问题。我只想返回最接近 CEAR 日期的那个。

【问题讨论】:

  • 你有没有机会想出一个更简单的例子(比如两个表,每个表只有几列),它表现出相同的问题,最好是样本数据和预期结果?
  • 您的WHERE 条件看起来不正确。我假设BasicStartDate 是一个日期字段,因此您需要"Actual Date From" 标准为(main_Tbl_ServiceOrder.BasicStartDate)&lt;=[CEAR326 Master Data fo access1].[Actual Date From]。否则,您将日期与文本字符串“实际日期来自”进行比较,这对我来说看起来不正确。不过,您仍然可能有重复项,因此我会在此之后创建一个堆叠查询,以便从该查询的结果中获取 MAX([BasicStartDate])。这应该只留下最接近 CEAR 日期的服务订单,而不是在 CEAR 日期之后。

标签: sql ms-access


【解决方案1】:

这个用途

  1. 投诉表,其中 ComplaintID 作为 Customer 和 Complaint_Date 的键和字段
  2. WorkOrders 表,其中 WorkOrderID 作为 Customer 和 WorkOrder_date 的键和字段

我假设每个客户每个日期只有一个工作订单。如果不是这样,您可能需要为 WorkOrders 使用自动编号字段,而不是选择条件中的日期字段

您应该能够使用您的表名和字段名自定义它。

SELECT Complaints.ComplaintID, Complaints.Customer, Complaints.Complaint_date, WorkOrders.WorkOrderID, WorkOrders.WorkOrder_date
FROM Complaints LEFT JOIN WorkOrders ON Complaints.Customer = WorkOrders.Customer
WHERE (((WorkOrders.WorkOrder_date) Is Null Or (WorkOrders.WorkOrder_date)=(select max(WorkOrder_Date) from WorkOrders T where T.customer=Complaints.customer and T.WorkOrder_date<Complaint_date)));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多