みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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')

投稿日時 - 2006-08-22 11:58:13

QNo.2354817

困ってます

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

>複数列の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')

投稿日時 - 2006-08-22 23:57:11

お礼

レスありがとうございます。

>(列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句が使えるのであれば、かなり幅が広がりました。ありがとうございました。

投稿日時 - 2006-08-23 11:24:35

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

s_husky です。

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

投稿日時 - 2006-08-23 08:37:16

お礼

レスありがとうございます。

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

投稿日時 - 2006-08-23 11:26:35

ANo.4

#3さんへ

列名=(select 列名 from 表名 ~)

という副問い合わせは、2行以上ヒットするとエラーになります。
SQL Serverでは違うのかと思いましたが、少なくとも2005 Expressでは予想通り「2行以上ヒットする」というエラーになりました。

「= ANY」や「= ALL」指定ならエラーになりませんが、今度は意味が違ってきます。

投稿日時 - 2006-08-23 08:24:06

ANo.3

s_husky です。

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

投稿日時 - 2006-08-23 08:07:03

ANo.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 を使う理由がなくなります。

投稿日時 - 2006-08-22 15:11:25

補足

一度補足を記載したのですが、登録ミスかな?表示されていないですね。

ここで、記載している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
には無いのでしょうか?

すみません。よろしくお願いします。

投稿日時 - 2006-08-22 20:01:14