一尘不染

根据多列条件更新行

sql

我试图基于另一个表中的其他两个列来更新表中的某些行。作为玩具模型,请考虑两个表: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)。那我想什至有可能吗?

(另一个问题是,这些表都没有任何主键,尤其是没有单列键。如果不是这种情况,我会用它来简单地标识行。)


阅读 135

收藏
2021-05-16

共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)
2021-05-16