我在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子句来完成,但我不知道如何应用它。希望任何人都可以提供帮助。
答案 0 :(得分:0)
需要更多信息:
如果没有,你可以期望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值,如您在问题中所述。否则,它将创建一个笛卡尔加入。