重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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

A 回答 (5件)

>複数列の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')
    • good
    • 1
この回答へのお礼

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

>(列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

s_husky です。



エラー確認しました。INはエラーでませんが=は複数行の時にエラーが出ました。
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2006/08/23 11:26

#3さんへ



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

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

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

s_husky です。



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

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

この回答への補足

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

ここで、記載している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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す