【问题标题】:How do I run an SQL update query using a like statement如何使用 like 语句运行 SQL 更新查询
【发布时间】:2014-02-16 09:48:39
【问题描述】:

我正在尝试使用 SQL 更新查询更新表中的字段,其中存在引用另一个表中的值的 like 语句。不幸的是,它们的语法不起作用。下面是我的代码。简而言之,当位于表 'tblSearchEngine07' 中的值存在于表 'tblSearchEngine01' 中的字段 'tblMasterListOfEventsNotes' 中时,我试图在表 'tblSearchEngine01' 中的字段 'Query07ParolaChiave' 中放置一个 '1'。我认为我的代码几乎是完整的,但有一个我找不到的语法问题。

st_sql = "UPDATE tblSearchEngine01, tblSearchEngine07 SET tblSearchEngine01.Query07ParolaChiaveSelect = '1' WHERE ((([tblSearchEngine01].[tblMasterListOfEventsNotes]) Like " * " & [tblsearchengine07].[ParolaChiave] & " * "))"
    Application.DoCmd.RunSQL (st_sql)

【问题讨论】:

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


    【解决方案1】:

    我建议你 2 个解决方案:

    这个正在使用EXISTS函数,如果tblsearchengine07中有匹配值,将检查tblSearchEngine01中的每一行

    UPDATE 
        tblSearchEngine01
    SET 
        tblSearchEngine01.Query07ParolaChiaveSelect = '1' 
    WHERE 
        EXISTS (SELECT 1 
                FROM tblsearchengine07
                WHERE [tblSearchEngine01].[tblMasterListOfEventsNotes] Like '*' & [tblsearchengine07].[ParolaChiave] & '*')
    

    这个性能更好,因为它使用JOIN

    UPDATE 
        tblSearchEngine01 
        INNER JOIN tblsearchengine07 
            ON [tblSearchEngine01].[tblMasterListOfEventsNotes] Like '*' & [tblsearchengine07].[ParolaChiave] & '*'
    SET 
        tblSearchEngine01.Query07ParolaChiaveSelect = '1'
    

    我在 ADO/VBA 中读到过类似的内容,您必须使用 % 而不是 * 作为通配符。

    您可以了解更多关于通配符和LIKE比较器here的信息

    更新

    为什么在您的第一个解决方案中选择后出现“1”? EXISTS (SELECT 1 ... 对性能更好,因为它只返回数字 1 而不是字段,无论如何 EXISTS 只是在找到 1 个元素后停止执行。

    'Performant' 意味着在空间和内存方面消耗更多? JOIN 在执行时间方面性能更高,RDBMS 在连接表方面比使用子查询要好得多,在极少数情况下,使用第一种解决方案更有趣。

    另外,关于为什么我的原始解决方案(直接来自有效的访问查询)不起作用的任何初步想法? 我真的不知道,但也许是因为" * ",因为你说的是​​SPACE + * + SPACE + VALUE + SPACE + * + SPACE。例如:'John' LIKE ' John '

    可能用"*" 而不是" * " 可以解决它...

    我没有其他的轨道,我不是Access sql developer,我经常玩Sql server/Oracle/mySql,希望对你有帮助。 ;)

    【讨论】:

    • 他们都工作得很好!你介意3澄清吗?为什么在您的第一个解决方案中选择后的“1”? “高性能”意味着在空间和内存方面消耗更多?另外,关于为什么我的原始解决方案(直接来自有效的访问查询)不起作用的任何初步想法?
    【解决方案2】:

    尝试这样改变你的喜欢:

    ... Like '*" & tblsearchengine07.parolachiave & "*'))"
    

    【讨论】:

    • 仍然无法正常工作:( st_sql = "UPDATE tblSearchEngine01, tblSearchEngine07 SET tblSearchEngine01.Query07ParolaChiaveSelect = '1' WHERE ((([tblSearchEngine01].[tblMasterListOfEventsNotes]) Like ' * " & [tblsearchengine07].[ ParolaChiave] & " * ' ))" Application.DoCmd.RunSQL (st_sql)
    【解决方案3】:

    like 语句进入 WHERE 子句。

    如果您确实想在不关心大写字母的情况下使用 LIKE,那么您可以像这样使用它:

    LIKE COLUMN_NAME = '%WhatYouLike%'

    【讨论】:

      【解决方案4】:

      我的建议是:

      1. 使用带有唯一/主键的表变量 (@Table) 来自要更新的表。
      2. 选择所有要更新的数据(您可以在此处添加like语句),然后将其插入到创建的表变量中。
      3. 使用与唯一/主键匹配的表变量的 INNER JOIN 构造 UPDATE 语句。

      我知道这可能需要很多步骤,但相信我这些步骤比使用黑名单方法更有效。

      【讨论】:

        最近更新 更多