• ベストアンサー

複数フィールドの条件について

SQL文について教えてください。 oracle,mysqlでは、下記の条件分 where (fieldA,fieldB) in (select fieldA,fieldB from TABLE_NAME) と言った条件を記載可能なのですが、SQLServer ではエラーになってしまいます。 違った構文があるのでしょうか?よろしくお願いします。 具体的にやっているSQLは update TABLE_NAME set FIELD_NAME='1' where (FIELDA,FIELDB) in (select FIELDA,FIELDB from TABLE_NAME2 where FIELDC='1')

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>複数列のinを使いたいのですが、SQLServer >には無いのでしょうか? 「(列1,列2) in(値1,値2)」という条件は、行値式または行値構成子と呼ばれますが、SQL Serverでは未サポートだったと思います。 副問い合わせのin条件は、existsで等価に表現できます。 updateでのSQL例は、下記のようになります。 SQL Serverでは、「update 表名」のすぐ後ろには別名は書けず、updateでも「from 表名 as 別名」と書く方式になっているようです。 update TABLE_NAME set FIELD_NAME='1' from TABLE_NAME as x where exists(select * from TABLE_NAME2 as y where x.FIELDA=y.FIELDA and x.FIELDB=y.FIELDB and y.FIELDC='1')

naochancom
質問者

お礼

レスありがとうございます。 >(列1,列2) in(値1,値2)」という条件は、行値式または行値構成子と呼ばれますが 行値式と言うのですね、知りませんでした。これも新しい発見です。ありがとうございます。 ご指示頂いた構文で問題なく出来ましたありがとうございます。 ここで、発見が2つ、existsは、値が存在するとき TRUEを返すとなっているので、update文は一件一件に対して、select文を発行しているのですね。 納得!!って感じです。 もう一つ、update文にfrom句が書けるのですね。 おぉ~って感じでした。なので、この構文もいけるのか?試してみました。 update TABLE_NAME set FIELD_NAME='1' from TABLE_NAME as x inner join TABLE_NAME2 as y on (x.FIELDA=y.FIELDA and x.FIELDB=y.FIELDB) where y.FIELDC='1' 結果上手く行ってそうです。。 from句が使えるのであれば、かなり幅が広がりました。ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (4)

noname#22222
noname#22222
回答No.5

s_husky です。 エラー確認しました。INはエラーでませんが=は複数行の時にエラーが出ました。

naochancom
質問者

お礼

レスありがとうございます。 今回、chukenkenkouさんの構文で問題なくいけました。 ありがとうございました。

すると、全ての回答が全文表示されます。
回答No.4

#3さんへ 列名=(select 列名 from 表名 ~) という副問い合わせは、2行以上ヒットするとエラーになります。 SQL Serverでは違うのかと思いましたが、少なくとも2005 Expressでは予想通り「2行以上ヒットする」というエラーになりました。 「= ANY」や「= ALL」指定ならエラーになりませんが、今度は意味が違ってきます。

すると、全ての回答が全文表示されます。
noname#22222
noname#22222
回答No.3

s_husky です。 IN でもOKでした。=でも書けたという意味です。

すると、全ての回答が全文表示されます。
noname#22222
noname#22222
回答No.1

一応、SQL Server 2000 でテストしてOKです。 が、スマートではないです。 よって、自信なしです。 UPDATE TABLE1 SET C='2' WHERE A IN (SELECT A FROM TABLE2 WHERE C='1') AND B IN (SELECT B FROM TABLE2 WHERE C='1') が、 UPDATE TABLE1 SET C='4' WHERE A = (SELECT A FROM TABLE2 WHERE C='1') AND B = (SELECT B FROM TABLE2 WHERE C='1') と IN を使う理由がなくなります。

naochancom
質問者

補足

一度補足を記載したのですが、登録ミスかな?表示されていないですね。 ここで、記載しているFIELDC(s_huskyさんのフィールドC)はプライマリキーではないのです。 キーは、FIELDA,FIELDBになります。 データ的には、 TABLE_NAME2: FIELDA | FIELDB | FIELDC ------------------------ A 1 1 A 2 1 A 3 2 B 1 2 B 2 1 と言ったようなデータになります。 なので、複数列のinを使いたいのですが、SQLServer には無いのでしょうか? すみません。よろしくお願いします。

すると、全ての回答が全文表示されます。

関連するQ&A