连接表查询返回右表

时间:2016-09-22 14:22:27

标签: sql ms-access

我是新访问者,并已在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之前发生,则返回多个Service命令会出现问题。我只想返回最接近CEAR日期的那个。

1 个答案:

答案 0 :(得分:0)

这使用

  1. 以ComplaintID为关键字的投诉表以及Customer和Complaint_Date的字段
  2. WorkOrders表,其中包含WorkOrderID作为键和Customer和WorkOrder_date的字段
  3. 我假设每个客户每个日期只有一个工单。如果不是这样,您可能需要使用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)));