【问题标题】:Can I have an inner SELECT inside of an SQL UPDATE?我可以在 SQL UPDATE 中有一个内部 SELECT 吗?
【发布时间】:2009-04-22 17:21:08
【问题描述】:

我有一个类似的数据库:

foo 具有列 idnamebar 具有列idfoo_id

我有一个带有foo.name 的传入HTTP 查询,我想在bar 中插入一行并适当设置bar.foo_id。所以,例如:

> SELECT * FROM foo;
id     name
------ -------
1      "Andrey"
(1 row)


> SELECT * FROM bar;
(0 rows)

给定"Andrey",我可以执行一个查询来获取:

> SELECT * FROM bar;
id     foo_id
------ -------
1      1
(1 row)

我的想法是:

> UPDATE bar SET foo_id=(SELECT id FROM foo WHERE foo.name=?)

但这似乎是错误的,因为 SELECT 的返回集,而不是值...

【问题讨论】:

    标签: mysql sql sqlite sql-update


    【解决方案1】:

    你必须这样做

    SELECT TOP 1 ID FROM foo where foo.name=?
    

    但除此之外,在更新中进行选择并没有什么问题。

    【讨论】:

      【解决方案2】:

      如果子查询只返回一个值(例如 MAX() 或 TOP 1),这将在 MS SQL Server 中工作

      我不确定这个语法是否在 MySQL 中分叉,但你可以试试...

      UPDATE
        bar
      SET
        bar.foo_id = foo.id
      FROM
        bar
      INNER JOIN
        foo
          ON foor.name = bar.name
      ORDER BY
        foo.id
      

      在这种情况下,如果连接在 bar 中的每条记录返回多个结果,则将应用所有结果。通过确定应用它们的顺序来确定顺序,最后一个是持久的。

      【讨论】:

        【解决方案3】:

        这至少可以在 sql server 和 oracle 上工作。

        【讨论】:

          【解决方案4】:

          试试看

          更新栏 SET foo_id = F.id 从栏 JOIN (SELECT id from foo where foo.name = @fooName) F

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-05-25
            • 1970-01-01
            • 2011-05-06
            • 2016-01-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多