SELECT distinct仍然会因连接而产生重复

时间:2016-12-19 15:59:05

标签: sql ms-access

我在Access中有一个SQL语句,它左边连接自己在报表中的1行中显示de数据库中的2行。

SELECT DISTINCT A.Action,
                A.Assignee,
                A.MachineID,
                A.TRDate,
                A.Remarks,
                Iif([B.Action] = "Lock", [B.ActionRemarks], "") AS Locked,
                C.VendorType
FROM   (ExportVendorWeekly AS A
        INNER JOIN Vendors AS C
                ON A.Assignee = C.VendorName)
       LEFT JOIN ExportVendorWeekly AS B
              ON ( A.ID = B.ID )
                 AND ( A.Date = B.Date )
WHERE  ( ( A.Action <> "Lock" )
         AND ( ( A.Assignee = "GTN" )
                OR ( C.VendorType = "MIT" ) ) )
ORDER  BY A.TRDate,
          A.MachineID; 

表格中的第一行包含Action&#34; DoSomething&#34;并且表格中的第二行包含Action&#34; Lock&#34;。这两个动作需要在两个不同的列中以一行显示。 使用我现在的SQL语句,它仍然显示两行,仅在第二行中显示B.ActionRemarks。

现在我明白这可以通过使用IN子句来完成,但我不知道如何应用它。希望任何人都可以提供帮助。

2 个答案:

答案 0 :(得分:0)

需要更多信息:

  1. ID(别名A / B)是唯一的吗?
  2. C.VendorName是唯一的吗?
  3. 如果没有,你可以期望LEFT JOIN产生超过1行,特别是如果有2行相等ID 不同日期字段

答案 1 :(得分:0)

在不知道您的数据的情况下,我认为您需要更改查询结构:

SELECT 
    A.Action,
    A.Assignee,
    A.MachineID,
    A.TRDate,
    A.Remarks,
    IIF([B.Action] = "Lock", [B.ActionRemarks], "") AS Locked,
    C.VendorType
FROM
    (SELECT Action, Assignee, MachineID, TRDate, Remarks
     FROM ExportVendorWeekly
     WHERE Action <> "Lock") A
LEFT JOIN
    (SELECT Action, Assignee, MachineID, TRDate, Remarks
     FROM ExportVendorWeekly
     WHERE Action = "Lock") B
    ON A.ID = B.ID
    AND A.Date = B.Date
INNER JOIN Vendors AS C
    ON A.Assignee = C.VendorName
WHERE
    A.Assignee = "GTN" 
    OR C.VendorType = "MIT" 
ORDER BY 
    A.TRDate,
    A.MachineID;   

这是假设您实际上只有2个可能的Action值,如您在问题中所述。否则,它将创建一个笛卡尔加入。

相关问题