具有多个WHERE条件的UPDATE语句

use*_*291 9 sql t-sql ms-access

我正在尝试UPDATE在Access中运行具有不同WHERE条件的查询:

UPDATE Table1
SET [Ticker] = "TXSFI" WHERE [Acct Numb] like "*03",
SET [Ticker] = "TESEI" WHERE [Acct Numb] like "*04";
Run Code Online (Sandbox Code Playgroud)

为什么我会收到错误?

Gor*_*off 8

您可以使用两个更新语句执行此操作:

UPDATE Table1
    SET Table1.[Ticker] = 'TXSFI' WHERE Table1.[Acct Numb] like '*03';

Update Table1
    SET Table1.[Ticker] = 'TESEI' WHERE Table1.[Acct Numb] like '*04';
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用条件更新(非Access版本)组合这些:

update table1
   SET Table1.[Ticker] = (case when  Table1.[Acct Numb] like '%03' then 'TXSFI'
                               when Table1.[Acct Numb] like '%04' then 'TESEI'
                          end)
   where Table1.[Acct Numb] like '%03' or Table1.[Acct Numb] like '%04'
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我猜你正在使用Access.SQL中的标准通配符可能是,like '%03'而Access使用的是'*'代替'%'.使用您正在使用的数据库标记问题是个好主意.

话虽如此,你不能case在Access中使用:

update table1
   SET Table1.[Ticker] = iif(Table1.[Acct Numb] like '*03', 'TXSFI', 'TESEI')
   where Table1.[Acct Numb] like '*03' or Table1.[Acct Numb] like '*04'
Run Code Online (Sandbox Code Playgroud)


Chr*_*cht 5

无论您有多少个不同的子句,都可以通过一个查询(没有嵌套IIFs)来做到这一点WHERE

这类似于我在此处(第二部分)的回答中所描述的内容:

  1. 创建一个临时表,如下所示:

    Acct Numb      NewTicker
    -------------------------
    *03            TXSFI
    *04            TESEI
    
    Run Code Online (Sandbox Code Playgroud)

    您可以根据需要输入任意数量的新行,每一行都有一个帐号的“过滤值”和一个新Ticker值。

  2. Table1使用此单个查询更新所有值:

    UPDATE Table1
    INNER JOIN tmp ON Table1.[Acct Numb] LIKE tmp.[Acct Numb]
    SET Table1.Ticker = tmp.NewTicker;
    
    Run Code Online (Sandbox Code Playgroud)

    是的,这JOIN部分乍一看很奇怪,但实际上可以与LIKE.

  3. 完成后,您可以再次删除临时表。