我有两个列的丑陋源数据,我们称之为EmpID
和SomeCode
。通常,EmpID映射到EmployeeListing
表。但有时,人们会在SomeCode
字段中输入员工ID。
之前在Excel中运行此报告的人通过使用if语句执行多个vlookup来解决此问题,并运行一些手动检查以确保结果准确。当我将这些文件移动到Access时,我不确定如何最好地处理这种情况。
理想情况下,如果SomeCode
为空,我希望告诉我的查询在EmpID
上进行左连接,否则在EmpID
上进行左连接
不幸的是,我无法在源数据中强制进行验证或进行任何排序。
这是我正在处理的完整SQL查询:
SELECT DDATransMaster.Fulfillment,
DDATransMaster.ConfirmationNumber,
DDATransMaster.PromotionCode,
DDATransMaster.DirectSellerNumber,
NZ([DDATransMaster]![DirectSellerNumber],[DDATransMaster]![PromotionCode]) AS EmpJoin,
EmployeeLookup.ID AS EmpLookup,
FROM FROM DDATransMaster
LEFT JOIN EmployeeLookup ON NZ([DDATransMaster]![DirectSellerNumber],[DDATransMaster]![PromotionCode]) = EmployeeLookup.[Employee #])
答案 0 :(得分:3)
您可以创建如下查询:
SELECT
IIf(EmpID Is Null, SomeCode, EmpID) AS join_field,
field2,
etc
FROM YourTable
或者如果查询将始终在Access会话中使用,Nz
更简洁。
SELECT
Nz(EmpID, SomeCode) AS join_field,
field2,
etc
FROM YourTable
当您将该查询加入其他表时,Access查询设计器可以表示join_field
与另一个表中某些匹配字段之间的联接。如果您尝试IIf
或Nz
作为联接的ON
子句的一部分,查询设计器无法在设计视图中正确显示连接 - 它仍然可以工作,但如果您是Access SQL新手,则可能不太方便。
查看此SQL是否为您提供了所需的内容。
SELECT
dda.Fulfillment,
dda.ConfirmationNumber,
dda.PromotionCode,
dda.DirectSellerNumber,
NZ(dda.DirectSellerNumber,dda.PromotionCode) AS EmpJoin,
el.ID AS EmpLookup
FROM
DDATransMaster AS dda
LEFT JOIN EmployeeLookup AS el
ON NZ(dda.DirectSellerNumber,dda.PromotionCode) = el.[Employee #])
但我会在子查询中使用Nz
部分。
SELECT
sub.Fulfillment,
sub.ConfirmationNumber,
sub.PromotionCode,
sub.DirectSellerNumber,
sub.EmpJoin,
el.ID AS EmpLookup
FROM
(
SELECT
Fulfillment,
ConfirmationNumber,
PromotionCode,
DirectSellerNumber,
NZ(DirectSellerNumber,PromotionCode) AS EmpJoin
FROM DDATransMaster
) AS sub
LEFT JOIN EmployeeLookup AS el
ON sub.EmpJoin = el.[Employee #])
答案 1 :(得分:1)
怎么样:
LEFT JOIN EmployeeListing ON NZ(EmpID, SomeCode)
作为你的连接,nz()使用第二个参数,如果第一个为null,我不是100%确定这种连接在访问中起作用。值得花20秒尝试。
希望它有效。
答案 2 :(得分:1)
您可以使用Union:
SELECT DDATransMaster.Fulfillment,
DDATransMaster.ConfirmationNumber,
DDATransMaster.PromotionCode,
DDATransMaster.DirectSellerNumber,
EmployeeLookup.ID AS EmpLookup
FROM DDATransMaster
LEFT JOIN EmployeeLookup ON
DDATransMaster.DirectSellerNumber = EmployeeLookup.[Employee #]
where DDATransMaster.DirectSellerNumber IS NOT NULL
Union
SELECT DDATransMaster.Fulfillment,
DDATransMaster.ConfirmationNumber,
DDATransMaster.PromotionCode,
DDATransMaster.DirectSellerNumber,
EmployeeLookup.ID AS EmpLookup
FROM DDATransMaster
LEFT JOIN EmployeeLookup ON
DDATransMaster.PromotionCode = EmployeeLookup.[Employee #]
where DDATransMaster.DirectSellerNumber IS NULL;