2011-12-09 25 views
0

別のテーブルの2つの他の列に基づいてテーブルの一部の行を更新しようとしています。おもちゃモデルとして、2つのテーブルを考えてみましょう。first_name、last_name、has_licenseという列を持つPeople。 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と日付で、サブクエリは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を使用してください。 SQL Serverで

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 

私は別名を使用しますが、私はSQLiteの構文の複雑さに慣れていませんよ。これは有効なAFAIKでなければなりません。バージョン以下

EDIT

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... 
関連する問題