質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

324閲覧

SQL文の書き換え(副問合わせ)

h28cis02

総合スコア8

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2018/04/26 08:40

編集2018/04/27 00:46

こんにちは。SQLについて質問です。

以下のSQLでは、INを用いて副問合せを行っています。
INの代わりにEXISTSを用いて記述したいと思っています。

sql

1UPDATE 2 HL_STF_MSTR STF 3SET 4 STF_PRIV_MAIL = 'hal-sec-cheif' 5WHERE 6 STF.POS_CD IN( 7 SELECT 8 POS.POS_CD 9 FROM 10 HL_POS_MSTR POS 11 WHERE 12 POS.POS_NAME LIKE '取締役%' 13 OR 14 POS.POS_NAME LIKE '%部長' 15 OR 16 POS.POS_NAME LIKE '%課長' 17 ) 18;

以下のようにEXISTSを用いて記述した結果、うまくいきませんでした...

sql

1UPDATE 2 HL_STF_MSTR STF 3SET 4 STF_PRIV_MAIL = 'hal-sec-cheif' 5WHERE 6 EXISTS( 7 SELECT 8 POS.POS_CD 9 FROM 10 HL_POS_MSTR POS 11 WHERE 12 POS.POS_NAME LIKE '取締役%' 13 OR 14 POS.POS_NAME LIKE '%部長' 15 OR 16 POS.POS_NAME LIKE '%課長' 17 AND 18 STF.POS_CD = POS.POS_CD 19 ) 20;

INの代わりにEXISTSを用いて記述することは可能でしょうか?
回答のほどよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2018/04/26 08:48

SQLを実行できるようCREATE TABLE, 数件でいいからINSERT くらいは載せましょう。>うまくいきませんでした... どうなりました?具体的に書いては?
shigotonin

2018/04/26 09:01

具体的にどのような結果になったのでしょうか? UPDATE文そのものが動作しないのか、対象外であるはずのデータまでUPDATEされているのか教えていただけますか?
Orlofsky

2018/04/26 20:35 編集

質問する時の情報は必要最小限なものに精査しましょう。この手の質問で掲示板に載せるCREATE TABLE文は質問のSQLを実行できる列だけで良いです。
guest

回答1

0

ベストアンサー

ORよりANDが優先されますので括弧()を付けてください。

SQL

1 ( 2 POS.POS_NAME LIKE '取締役%' 3 OR 4 POS.POS_NAME LIKE '%部長' 5 OR 6 POS.POS_NAME LIKE '%課長' 7 ) 8 AND 9 STF.POS_CD = POS.POS_CD

投稿2018/04/26 08:54

編集2018/04/26 10:24
hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/04/26 09:29

ANDやORなどの論理演算子同士に優先度はありません。 括弧で括っていないから意図した動作になっていないって事ですね。
sazi

2018/04/26 09:59

これは評価順序ですよね。 評価結果には関係無いです。
hihijiji

2018/04/26 10:22

確かにどっち優先でも括弧無しだと不味いですね。
sazi

2018/04/26 10:28

この場合の理由としては、in で行っていた条件に対して、existsに変更することによる相関問い合わせの条件がANDされるということで、ドモルガンの法則による展開が正しく行われていないことにあります。 冗長な書き方をすれば、 (POS.POS_NAME LIKE '取締役%' and STF.POS_CD = POS.POS_CD) or (POS.POS_NAME LIKE '%部長' and STF.POS_CD = POS.POS_CD) or (POS.POS_NAME LIKE '%課長' and STF.POS_CD = POS.POS_CD) となります。 oracleの評価順序に関しては知らなかったのですが、その場合、 POS.POS_NAME LIKE '取締役%' and STF.POS_CD = POS.POS_CD or POS.POS_NAME LIKE '%部長' and STF.POS_CD = POS.POS_CD or POS.POS_NAME LIKE '%課長' and STF.POS_CD = POS.POS_CD の記述で同じ結果になるということですよね。
h28cis02

2018/04/26 23:51

実行することができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問