根据多列条件更新行

时间:2011-12-09 21:40:15

标签: sql sqlite

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

我能做到:

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)。那就是我想要的甚至可能吗?

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

2 个答案:

答案 0 :(得分:2)

这是 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)

答案 1 :(得分:0)

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

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

或者

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