SQLのwhere句について教えてください。Table_AとTable_Bはjoinされています。
下記の条件で、値を抽出したいです。型はintです。
Field1は必ずNULL
Field2は値が1~14のどれか。それ以外にはマッチしない
Field3は0か3のどちらかにマッチ。
Field4は2,3,4,8に以外にマッチ。
Field5は0,6のどちらかいにマッチ。
Field6はNULLを抽出
Field7はNULLを抽出
よって、下記のSQLを書きました。しかしながら、Field1~Field3まで抽出を
かけた時に、1万件だったのが、Field1~Field5までを含めると、1万2000件に
なってしまいます。なぜだかわかりません。何が間違っているかお教え
頂けないでしょうか?また正しいwhere句以下の条件はどのように正しく書けばいいのでしょうか?
WHERE
`TABLE_A`.`Field1` IS NULL AND
`TABLE_B`.`Field2` = 1 or
`TABLE_B`.`Field2` = 2 or
`TABLE_B`.`Field2` = 3 or
`TABLE_B`.`Field2` = 4 or
`TABLE_B`.`Field2` = 5 or
`TABLE_B`.`Field2` = 6 or
`TABLE_B`.`Field2` = 7 or
`TABLE_B`.`Field2` = 8 or
`TABLE_B`.`Field2` = 9 or
`TABLE_B`.`Field2` = 10 or
`TABLE_B`.`Field2` = 11 or
`TABLE_B`.`Field2` = 12 or
`TABLE_B`.`Field2` = 13 or
`TABLE_B`.`Field2` = 14 or
`TABLE_B`.`Field3` = 0 or
`TABLE_B`.`Field3` = 3 or
`TABLE_B`.`Field4` <> 2 or
`TABLE_B`.`Field4` <> 3 or
`TABLE_B`.`Field4` <> 4 or
`TABLE_B`.`Field4` <> 8 or
`TABLE_B`.`Field5` = 0 or
`TABLE_B`.`Field5` = 6 or
`TABLE_B`.`Field6` is NULL or
`TABLE_B`.`Field7` is NULL
No.2ベストアンサー
- 回答日時:
条件が
Field1は必ずNULL
かつ
Field2は値が1~14のどれか。それ以外にはマッチしない
かつ
Field3は0か3のどちらかにマッチ。
かつ
Field4は2,3,4,8に以外にマッチ。
かつ
Field5は0,6のどちらかいにマッチ。
かつ
Field6はNULLを抽出
かつ
Field7はNULLを抽出
であれば
WHERE
(`TABLE_A`.`Field1` IS NULL) AND
(`TABLE_B`.`Field2` >= 1 AND
`TABLE_B`.`Field2` <= 14) AND
(`TABLE_B`.`Field3` = 0 or
`TABLE_B`.`Field3` = 3) AND
(`TABLE_B`.`Field4` <> 2 AND
`TABLE_B`.`Field4` <> 3 AND
`TABLE_B`.`Field4` <> 4 AND
`TABLE_B`.`Field4` <> 8) AND
(`TABLE_B`.`Field5` = 0 or
`TABLE_B`.`Field5` = 6) AND
(`TABLE_B`.`Field6` is NULL) AND
(`TABLE_B`.`Field7` is NULL)
と書きます。
質問者さんが書いたWHERE文は
Field1は必ずNULL
かつ
Field2は値が1~14のどれか。それ以外にはマッチしない
または
Field3は0か3のどちらかにマッチ。
または
Field4は2以外にマッチ。
または
Field4は3以外にマッチ。
または
Field4は4以外にマッチ。
または
Field4は8以外にマッチ。
または
Field5は0,6のどちらかいにマッチ。
または
Field6はNULLを抽出
または
Field7はNULLを抽出
に一致する。
特に
Field4は2以外にマッチ。
または
Field4は3以外にマッチ。
または
Field4は4以外にマッチ。
または
Field4は8以外にマッチ。
は「無条件」と同一になります。何が来ても条件が真になるのを理解できますか?
また、各フィールドの条件を「または」で連結しているので、フィールド条件を1~3から1~5に増やすと「または」により条件が広がるので、一致レコードが増えます。
「1が赤」かつ「2が白」または「3が青」(フィールド条件が1~3)
から
「1が赤」かつ「2が白」または「3が青」または「4が黒」または「5が緑」(フィールド条件が1~5)
に変えれば、『「4が黒」または「5が緑」』の条件に一致するレコードが増えます。
「4が黒」の物が無条件に増え、「5が緑」の物が無条件に増えます。なので
>Field1~Field3まで抽出を
>かけた時に、1万件だったのが、Field1~Field5までを含めると、1万2000件に
>なってしまいます。
となるのが「当たり前」です。
ORは、条件を「絞り込む」のではなく、条件を「緩和」させます。
条件を絞り込むにはANDを使います。
なお
「2でも3でも4でも8でもない」
は
(`TABLE_B`.`Field4` <> 2 or
`TABLE_B`.`Field4` <> 3 or
`TABLE_B`.`Field4` <> 4 or
`TABLE_B`.`Field4` <> 8)
ではありません。
「2でも3でも4でも8でもない」
は
「2でない、かつ、3でない、かつ、4でない、かつ、8でない」
だと言う事を理解しましょう。
もし
「2でない、または、3でない、または、4でない、または、8でない」
と書くと、これは
「何でもよい」
と言う意味になります。
1がくると
「2でないは真、または、3でないは真、または、4でないは真、または、8でないは真」
で、全体は真になります。
2がくると
「2でないは偽、または、3でないは真、または、4でないは真、または、8でないは真」
で、全体は真になります。
3がくると
「2でないは真、または、3でないは偽、または、4でないは真、または、8でないは真」
で、全体は真になります。
4がくると
「2でないは真、または、3でないは真、または、4でないは偽、または、8でないは真」
で、全体は真になります。
どうです?「何が来ても無条件に真になる」のが判りますか?
No.1
- 回答日時:
書いてあるWHERE句からすると
Field1は必ずNULL
かつ
Field2は値が1~14のどれか。それ以外にはマッチしない
または
Field3は0か3のどちらかにマッチ。
または
Field4は2,3,4,8に以外にマッチ。
または
Field5は0,6のどちらかいにマッチ。
または
Field6はNULLを抽出
または
Field7はNULLを抽出
って感じになりますけどあってますか?
Field1とField6、7の違いも良くわかりませんが、Field1には全レコードで必ずNULLが入っていてField6、7はいろいろ入ってるけどNULLのものを抽出するってことでしょうか?
WHERE
`TABLE_A`.`Field1` IS NULL AND
(`TABLE_B`.`Field2` = 1 OR
・・・ OR
`TABLE_B`.`Field2` = 14) AND
(`TABLE_B`.`Field3` = 0 OR
`TABLE_B`.`Field3` = 3) AND
(`TABLE_B`.`Field4` <> 2 AND
`TABLE_B`.`Field4` <> 3 AND
`TABLE_B`.`Field4` <> 4 AND
`TABLE_B`.`Field4` <> 8) AND
(`TABLE_B`.`Field5` = 0 OR
`TABLE_B`.`Field5` = 6) AND
`TABLE_B`.`Field6` is NULL AND
`TABLE_B`.`Field7` is NULL
こんな感じじゃないでしょうか。
・・・のところは適当にいれてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript EasyUIのSubGrid(jquery)におけるObjectに入れた連想配列について 1 2022/05/02 11:21
- 作詞・作曲 【花の苗】という言葉は、詩的にはどのような事物を表現しているのでしょうか? 1 2023/03/16 09:23
- JavaScript 【jquery】EasyUIのSubGridにMySQLのテーブルデータを表示&編集にしたい 5 2022/05/02 13:10
- Visual Basic(VBA) Dateserialで データ抽出 2 2022/06/26 21:07
- PHP php エラー 2 2022/10/23 16:43
- 英語 in the fieldってどういう意味でしょうか? 5 2022/12/10 22:45
- Visual Basic(VBA) VBAのフィルター操作 5 2023/08/08 09:48
- Visual Basic(VBA) 前回質問の続きになりますが、下記マクロでシート1からシート2の抽出項目セルB3「りんご」とセルC2「 2 2022/12/02 17:37
- MySQL SHOW CREATE TABLE posts;これって何ですか? 3 2022/08/28 22:57
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessのクエリで1フィールドの...
-
Access2007でSQLの複数列副問い...
-
アクセスのフィルタ nullにつ...
-
Accessクエリ特定文字列のカウ...
-
Accessクエリで特定の行を削除...
-
accessで空白の時の抽出
-
Access クエリで連結する文字...
-
Accessのクエリーのゼロデータ...
-
accessで年代別抽出方法
-
このSQLを教えてください
-
SQLのLIKE検索で清音と濁音/半...
-
Access クエリ作成でパラメータ...
-
AccessからExcelへの条件付エク...
-
access2019 チェックボックスと...
-
アクセス Access 時間の引き算
-
差込印刷で顧客別に複数行のデ...
-
アクセスのレポートのヘッダー...
-
アクセスで入力したデータの順...
-
「#エラー」の回避
-
Accessのレポート上のテキスト...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessクエリで特定の行を削除...
-
Access2007でSQLの複数列副問い...
-
Accessのクエリーのゼロデータ...
-
アクセスのフィルタ nullにつ...
-
access2019 チェックボックスと...
-
Accessのデータの一部を削除す...
-
Access クエリで連結する文字...
-
AccessからExcelへの条件付エク...
-
Accessのクエリで1フィールドの...
-
access(アクセス):パラメータ...
-
Accessクエリで年月フィールド...
-
Accessクエリ特定文字列のカウ...
-
accessで空白の時の抽出
-
アクセスで任意の件数を抽出す...
-
Access:固定長文字列ファイル...
-
Access Left$関数で全角半角が...
-
テーブルの差分をとる結合
-
ACCESS クエリ 抽出条件が多い場合
-
Access2003 削除クエリで式1フ...
-
ACCESSでのフィールド比較方法?
おすすめ情報