Access / SQL Select Query - 仅返回“Most Like”值

时间:2016-01-25 15:18:15

标签: sql ms-access-2010 sql-like

我们在AccessDB中有一个退款流程,其中部门必须批准其他部门输入的费用。我们只需要一个“默认”审批者,但数据的设置方式和我们当前用来填写审批者的查询会返回多个结果。

例如,在tUserSec表中,我们有两列。名称(UserIDX)和UserCode

User1 - 550 *

User2 - 55003 *

这里的想法是User1是Director,因此对于该部门的所有内容都是“catchall”,而User2是一名经理,专门分配给一个较窄的部门。部门总共7个字符。

假设部门是5500309,其想法是User2应该作为批准者填充,因为他们的代码与部门ID最匹配。但是,使用“赞”标准会返回两个用户,并且表单似乎随机选择两个用户中的一个,没有押韵或我可以确定的原因。它总是为5500309选择User1,但总是为5500301选择User2,尽管没有进一步的描述 - 但理想情况下User1不应该填充,除非没有其他人匹配更近。

下面是SQL的简化版本,我删除了其他一些混乱情况的东西:

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

如何更改此权限,以便我只引入最像用户代码的UserID?我试图找出一种方法来根据用户代码的长度或最大值拉入UserID,但我无法找到一种有效的方法。这是一个安全的假设,如果两个用户的用户代码“喜欢”那个用户代码最长的用户代码就是我们想要的用户代码。

(这是我在这里的第一个问题,并且如何最好地解释这个问题。请温柔:))

1 个答案:

答案 0 :(得分:0)

首先,我必须说这里的主要问题是开发人员认为他们会聪明并在部门和用户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

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