
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')
レスありがとうございます。
>(列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句が使えるのであれば、かなり幅が広がりました。ありがとうございました。
No.4
- 回答日時:
#3さんへ
列名=(select 列名 from 表名 ~)
という副問い合わせは、2行以上ヒットするとエラーになります。
SQL Serverでは違うのかと思いましたが、少なくとも2005 Expressでは予想通り「2行以上ヒットする」というエラーになりました。
「= ANY」や「= ALL」指定ならエラーになりませんが、今度は意味が違ってきます。
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 を使う理由がなくなります。
この回答への補足
一度補足を記載したのですが、登録ミスかな?表示されていないですね。
ここで、記載している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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エラーについて
-
アクセスでエラー このフィー...
-
#1062 - '0' は索引 'PRIMARY' ...
-
SQLserver2005 nvarchar を flo...
-
PL/SQL ORA-06502エラーに関し...
-
AccessからORACLEへのリンク設...
-
空白はダメというエラーの表示...
-
SQL文長の制限
-
Access2007のVBAにてSendObject...
-
【Excel】[Expression.Error] ...
-
Batch: フォルダ内の特定のファ...
-
selectした結果の余計な余白を...
-
SQLPLUSで結果を画面に表示しない
-
アクセスクエリ(複数)→マクロ...
-
【CSVファイル】先頭の文字列に...
-
ThunderbirdのメールをCSVでま...
-
100万行のCSVを10万行ずつのフ...
-
特定のエクセルファイルを起動...
-
相手のPCにVBAからメッセ...
-
accessのmdbが勝手にできている?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
オラクル(PL/SQL)のエラー
-
アクセスでエラー このフィー...
-
SQLserver2005 nvarchar を flo...
-
AccessVBA 実行時エラー'2766'...
-
#1062 - '0' は索引 'PRIMARY' ...
-
DocuWorksでの印刷
-
列名に変数を使うことはできな...
-
Access2010実行時エラー-21473525
-
空白はダメというエラーの表示...
-
SQL*Loaderで「オブジェクトが...
-
Transact-SQLのBULK INSERTでエ...
-
UPDATEを使ったSQL文にて
-
MySQLでcreateが使えない MySQL...
-
エラーについて
-
PL/SQL ORA-06502エラーに関し...
-
オラクルでisnumeric?
-
Access 実行時エラー'3075' 対...
-
SQLCODE=-420とはどういうエラ...
-
ACCESSでエラー時に再起動する方法
-
BULK INSERTのエラー取得は可能...
おすすめ情報