具有多个WHERE条件的UPDATE语句

时间:2013-07-01 14:01:49

标签: sql tsql ms-access

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

UPDATE Table1
SET [Ticker] = "TXSFI" WHERE [Acct Numb] like "*03",
SET [Ticker] = "TESEI" WHERE [Acct Numb] like "*04";

为什么会出错?

2 个答案:

答案 0 :(得分:7)

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

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

Update Table1
    SET Table1.[Ticker] = 'TESEI' WHERE Table1.[Acct Numb] like '*04';

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

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'

顺便说一下,我猜你正在使用Access。 SQL中的标准通配符为like '%03',但Access使用'*'而不是'%'。最好用您正在使用的数据库标记您的问题。

话虽如此,您无法在Access中使用case

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'

答案 1 :(得分:1)

使用一个查询(无需嵌套IIF s),无论您有多少WHERE个条款,都可以执行此操作。

这与我在my answer here (second part)中所描述的相似:

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

    Acct Numb      NewTicker
    -------------------------
    *03            TXSFI
    *04            TESEI
    

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

  2. 使用以下单个查询更新Table1中的所有值:

    UPDATE Table1
    INNER JOIN tmp ON Table1.[Acct Numb] LIKE tmp.[Acct Numb]
    SET Table1.Ticker = tmp.NewTicker;
    

    是的,JOIN部分乍一看看起来很奇怪,但是it's actually possible to join with LIKE

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