2011-12-09 106 views
0

我想基于另一个表中的其他两列更新表中的某些行。作为玩具模型,请考虑两个表: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和一个日期,子查询是比较复杂的,涉及一个加入/ EXCEPT子句。)

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

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

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

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

回答

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) 
+0

AFAICT,在标准SQL中,UPDATE语句没有FROM子句。它不在sqlite,也不在Oracle(生产数据库)中,也不在网上找到的sql指南。 (这是有道理的,因为加入的结果是一个临时的,我需要更新永久的东西。) – AFoglia

+0

它在SQL Server ....让我研究你的SQLite语法。 – JNK

+0

我会使用'EXISTS'发布一个版本,让我知道它是否适用于您的实施。 – JNK

0

我想你可以连接的字段:

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

或者

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