Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Access/SQL选择查询-返回;最喜欢;仅值_Sql_Ms Access 2010_Sql Like - Fatal编程技术网

Access/SQL选择查询-返回;最喜欢;仅值

Access/SQL选择查询-返回;最喜欢;仅值,sql,ms-access-2010,sql-like,Sql,Ms Access 2010,Sql Like,我们在AccessDB中有退单流程,各部门必须批准其他部门输入的费用。我们只需要一个“默认”审批人,但数据设置方式和当前用于填写审批人的查询会返回多个结果 例如,在tUserSec表中,我们有两列。名称(UserIDX)和用户代码 用户1-550* 用户2-55003* 这里的想法是,User1是主管,也是这个部门所有事情的“总指挥”,而User2是经理,专门分配给一个较窄的部门。部门总长度为7个字符 假设部门为5500309,其想法是User2应填充为审批人,因为他们的代码与部门ID最为匹配。

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

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

用户1-550*

用户2-55003*

这里的想法是,User1是主管,也是这个部门所有事情的“总指挥”,而User2是经理,专门分配给一个较窄的部门。部门总长度为7个字符

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

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

SELECT TDepts.Dept, TDepts.DDescr, tUserSec.UserIDX
FROM tUserSec, TDepts
WHERE (((TDepts.Dept) Like [usercode] & "*"));
我怎样才能改变这一点,使我只拉入最像用户代码的用户ID?我试图找到一种基于用户代码的长度或最大值等来提取用户ID的方法,但是我找不到一种有效的方法。这是一个安全的假设,如果两个用户的用户代码与部门“相似”,那么最长的用户代码就是我们想要的


(这是我在这里提出的第一个问题,也是如何最好地解释这个问题的一个难题。请温柔一点:)

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

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

您试图使用“有意义的代码”,这是一种矛盾修饰法。更好的方法是在数据库设计中加入人员和部门之间的关系。使用%作为通配符,而不是*。单引号而不是双引号。定义“最相似”,在数字定义中更接近?(7比接近1更接近10)或在字母中更接近?(77比70更接近7709,因为它有两个相关字符)55003比550更像5500309。然而,在我们的例子中,最长的值“like”这个部门等于同一件事。我一直在试图找到一种方法将其应用到access中,但我没有想到任何东西。我甚至不知道InStr Join应该如何工作,因为它从左到右搜索,所以它不总是在1处找到值吗?无论用户代码是550还是55003,它都将从字段的开头开始。我在这里可能有点不知所措。这似乎对我来说应该是一件简单的事情,使用基本的功能-我得到的select查询每个DeptID有多个用户名,我完全知道应该用什么标准消除重复项。你完全正确。我的错误。我会再考虑一下,我已经重写了这个查询。通常的注意事项-我不使用Access,所以这只是一般的SQL知识。新查询的稍微修改版本运行良好。然而,它也帮助我偶然发现了一个简单但却不雅观的解决方案。我还不习惯这些论坛,很早就按下了enter键,当我添加其余的评论时,我已经没有时间了——哎呀。该解决方案有效,但增加了一点处理延迟。这个数据库的创建者设置它的方式是填充一个下拉表单,所以延迟不是理想的。事实证明,我真正需要做的就是将usercode添加为一个字段,并对其进行降序排序,以便更具体的代码首先出现在每个部门的列表中。因此,当用户从下拉列表中选择部门时,它只会抓取要出现的第一个用户名。