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

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

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

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

Q&A

解決済

4回答

12697閲覧

EXISTSとNOT EXISTSが混在する場合

enigumalu

総合スコア192

SQL

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

0グッド

2クリップ

投稿2017/07/26 10:39

WHEREの条件先で同一テーブル内にEXISTSで判定したいものとNOT EXISTSで判定したいものが混在した場合処理をまとめることはできますでしょうか
cont_idで通常の国コードでcont_flagが1の場合契約ありとし、NO_XXがきた場合cont_flagが1の場合契約違反としています
cont_flagは契約があれば1ですがそうでない場合は不規則のためこうしています

SELECT * FROM master_tb mt INNER JOIN lang_num ln ON mt.id = ln.id WHERE mt.delete_flg = '0' AND (EXISTS ( SELECT lw.id FROM lang_type lw WHERE lw.id = ln.cd_num AND lw.cont_id IN ('US', 'EN') AND lw.cont_flag ='1' ) OR NOT EXISTS ( SELECT lw.id FROM lang_type lw WHERE lw.id = ln.cd_num AND lw.cont_id IN ('NO_GB', 'NO_ES', 'NO_TW') AND lw.cont_flag ='1' ) )

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

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

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

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

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

guest

回答4

0

求めたい条件が明確ではないのでアレですが、テーブルを結合し表にした形に対して条件をしていくとすっきりするのかもしれませんね。

そもそもexistsによる判定ありきで混乱している気がします。
以下やりたいことを推測したサンプルです。

SELECT * FROM master_tb mt INNER JOIN lang_num ln ON mt.id = ln.id INNER JOIN lang_type lw ON lw.id = ln.cd_num WHERE mt.delete_flg = '0' AND ( (lw.cont_flag ='1' AND lw.count_id NOT like 'NO%') OR lw.cont_flag !='1' ) AND lw.cont_id IN ('US', 'EN') -- ここが抽出条件?

投稿2017/07/27 03:08

sazi

総合スコア25173

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

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

0

「cont_flagが1かつcont_idがNO_XXでない」レコードを抽出するという仕様でしたら、以下でどうでしょうか。

sql

1SELECT 2 * 3FROM 4 master_tb mt 5 INNER JOIN lang_num ln 6 ON mt.id = ln.id 7WHERE mt.delete_flg = '0' 8 AND (EXISTS ( 9 SELECT 10 lw.id 11 FROM 12 lang_type lw 13 WHERE lw.id = ln.cd_num 14 AND lw.cont_id IN ('US', 'EN') 15 AND lw.cont_id NOT LIKE 'NO_%' 16 AND lw.cont_flag ='1' 17 )

投稿2017/07/27 01:56

ksi

総合スコア10

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

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

0

OR NOT EXISTSでいいのでしょうか?そこはAND NOT EXISTSのような気がします。

ORの場合:契約のある国または契約違反のない国 つまり 契約違反のない契約のない国 とか 契約があるけど契約違反の国もOK

ANDの場合:契約のある国かつ契約違反のない国

投稿2017/07/26 12:54

oskbt

総合スコア1895

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

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

0

ベストアンサー

動いているのであれば、問題なさそうですが、
何に困っているのでしょうか?

別のSQLの書き方であれば、いくつかありますが、
想定しうる仕様から考えると
「まとめる(EXISTS句とNOT EXISTS句の両方を使わない(?)」事は難しいと思います。

EXISTS句で抽出できるデータは全てNOT EXISTS句の条件で絞るデータに含まれるような仕様であれば、
NOT EXISTS句だけにする事はできると思いますが、
質問文とSQLを見る限り、そうではなさそうですね。

投稿2017/07/26 12:34

tomari_perform

総合スコア760

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

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

enigumalu

2017/07/27 09:24

「一致するものを省く」と「一致しない」とは処理が違うので無理そうですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問