【问题标题】:Updating rows based on a multiple column condition根据多列条件更新行
【发布时间】:2011-12-13 04:24:58
【问题描述】:

我正在尝试根据另一个表中的其他两列更新表中的某些行。作为一个玩具模型,考虑两个表:People,具有 first_name、last_name 和 has_license 列;驱动程序,包含 first_name 和 last_name 列。现在我想更新第一个表,所以 has_license='Y' 为所有在 Drivers 表中的 first_name 和 last_name 元组。

我能做到:

UPDATE people SET has_license='Y'
WHERE first_name + last_name IN (SELECT first_name + last_name FROM drivers)

(在我的实际查询中,first_name 和 last_name 是外部设置的记录 id 和日期,子查询更复杂,涉及到 join/EXCEPT 子句。)

这很笨拙,并且可能会根据值出现错误。理想情况下,我可以像这样在 sql 中创建元组:

UPDATE people SET has_license='Y'
WHERE (first_name, last_name) IN (SELECT first_name, last_name FROM drivers)

但那是无效的 SQL(根据 SQLite)。那么我想要的可能吗?

(另一个问题是没有一个表有任何主键,尤其是没有单列的。如果不是这样,我会用它来简单地识别行。)

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    这是 SQL

    只需使用JOIN

    UPDATE people 
    SET has_license='Y'
    FROM People
    INNER JOIN Drivers
        ON Drivers.First_name = people.first_name
        AND Drivers.Last_name = people.last_name
    

    在 SQL Server 中,我只会使用别名,但我不熟悉 SQLite 语法的复杂性。这应该是有效的 AFAIK。

    编辑

    以下版本使用EXISTS:

    UPDATE people 
    SET has_license='Y'
    WHERE EXISTS (SELECT 1 FROM Drivers
                  WHERE Drivers.First_name = people.first_name
                  AND Drivers.Last_name = people.last_name)
    

    【讨论】:

    • AFAICT,在标准 SQL 中,UPDATE 语句没有 FROM 子句。它不在 sqlite 或 Oracle(生产数据库)中,也不在我可以在网上找到的 sql 指南中。 (这是有道理的,因为连接的结果是暂时的,我需要更新一些永久性的东西。)
    • 我将使用EXISTS 发布一个版本,让我知道它是否适用于您的实现。
    • 谢谢,这行得通,但我希望有更快的版本。看起来它将为 people 表中的每一行查询 Drivers 表。我希望有更等同于 Oracle 的 MERGE INTO 命令的东西,生产需要性能。
    • 在运行之前你不知道它的运行速度有多快 :) 我不了解 SQLite 内部结构,但在 SQL Server 中这会非常快。
    • 嗯,我知道我要替换的是 Oracle MERGE INTO 语句,它将涉及三个查询。 (目标是让开发人员针对 sqlite 运行单元测试。)这涉及 people 表中的每行一个查询。在我们的开发人员 Oracle 实例上,它慢了 10 倍。不过,我开始怀疑还有什么更好的。
    【解决方案2】:

    我认为您可以连接这些字段:

    ...first_name + last_name) IN (SELECT first_name + last_name...
    

    或者

    ...first_name  + ' : ' +  last_name) IN (SELECT first_name  + ' : ' +  last_name...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      • 2018-11-13
      • 2021-11-25
      • 2019-07-24
      • 1970-01-01
      • 1970-01-01
      • 2023-02-20
      相关资源
      最近更新 更多