【问题标题】:UPDATE statement with multiple WHERE conditions具有多个 WHERE 条件的 UPDATE 语句
【发布时间】:2013-06-28 16:26:43
【问题描述】:

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

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

为什么会出错?

【问题讨论】:

  • 对 SQL 字符串文字使用 ' 而不是 "
  • 1 个查询中不能有 2 个 where 子句。
  • 感谢您的回复,但是当我尝试执行此操作时,它显示错误为缺少运算符。
  • @juergend: 有没有什么方法可以用 2 个以上的 where 语句更新单个 coloum?

标签: sql tsql ms-access


【解决方案1】:

你可以用两个更新语句来做到这一点:

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

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

或者,您可以使用条件更新(非 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'

顺便说一句,我猜你正在使用 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'

【讨论】:

  • 谢谢。第一个对我来说很好用。抱歉,问题不完整。是的,我正在使用 Access 进行查询。再次感谢。真的很感激。
  • UPDATE Table1 SET Table1.[Ticker_Symbol_Id] = 'DUMMY' WHERE Table1.[Acct Numb] not like ('*01'.'*03'.'*04'.'*07'. '*08'. '*09');我们不能在更新查询中使用 not like 语句吗?
【解决方案2】:

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

这和我在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. 完成后可以再次删除临时表。

【讨论】:

    最近更新 更多