Access/SQL Select 查询 - Return "Most Like" 仅值

Access/SQL Select Query - Return "Most Like" Value Only

我们在 AccessDB 中有一个退款流程,部门必须批准另一个部门输入的费用。我们只想要一个 'default' 批准人,但是数据的设置方式和我们目前用来填写批准人的查询 returns 多个结果。

例如,在 tUserSec table 中,我们有两列。名称 (UserIDX) 和用户代码

用户 1 - 550*

用户 2 - 55003*

这里的想法是 User1 是主管,因此 'catchall' 负责该部门的所有工作,而 User2 是经理,专门分配给一个更小的部门。部门总是总共 7 个字符。

假设部门是 5500309,想法是 User2 应该填充为审批人,因为他们的代码与部门 ID 最匹配。但是,使用 "Like" 标准 returns 用户和表单随机出现在 select 两个用户之一,我无法确定任何押韵或原因。它总是 selects User1 for 5500309 但总是 selects User2 for 5500301,尽管没有进一步的描述 - 但理想情况下 User1 根本不应该填充,除非没有其他人匹配更接近。

下面是SQL的简化版,我删掉了一些其他乱七八糟的东西:

SELECT TDepts.Dept, TDepts.DDescr, tUserSec.UserIDX
FROM tUserSec, TDepts
WHERE (((TDepts.Dept) Like [usercode] & "*"));

如何更改此设置,以便我只提取与用户代码最相似的用户 ID?我试图找出一种方法来根据用户代码的长度或最大值等来提取 UserID,但我找不到可行的方法。这是一个安全的假设,如果两个用户的用户代码是 "like" 部门,那么最长的用户代码就是我们想要的。

(这是我在这里的第一个问题,我一直在为如何最好地解释这个问题而苦苦挣扎。请保持温和:))

首先,我不得不说这里的主要问题是当开发人员认为他们会很聪明并在部门和用户 ID 中构建大量逻辑时。将此类信息隐藏在列中通常是令人头疼的一大来源(正如您刚刚开始看到的那样)。

我不使用 Access 进行开发,所以我不确定语法,但希望您能大致了解。请让我知道是否需要为发现此问题的未来用户调整语法:

SELECT
    D.Dept,
    D.DDescr,
    U.UserIDX
FROM
    TDepts D
LEFT OUTER JOIN
(
    SELECT
        SQ_D.Dept,
        MAX(LEN(SQ_U.usercode)) AS max_len_usercode
    FROM
        TDepts SQ_D
    INNER JOIN tUserSec SQ_U ON SQ_D.Dept LIKE SQ_U.usercode & "*"
    GROUP BY
        SQ_D.Dept
) SQ ON SQ_D.Dept = D.Dept
LEFT OUTER JOIN tUserSec U ON
    D.Dept LIKE U.usercode & "*" AND
    LEN(U.usercode) = SQ.max_len_usercode

查询获取所有部门的列表以及与该部门匹配的最长用户代码的长度。然后它使用它来确定哪个用户与 "most like" 部门匹配。