如果第一列为空,是否可以在第二列的Access中执行连接?

时间:2013-04-29 16:01:27

标签: database ms-access

我有两个列的丑陋源数据,我们称之为EmpIDSomeCode。通常,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 #])

3 个答案:

答案 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与另一个表中某些匹配字段之间的联接。如果您尝试IIfNz作为联接的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;