- ベストアンサー
WHERE句の条件の記述の順序
PRIMARY KEYとINDEXがテーブルに設定されている場合、 検索条件に記述する順番はどのようになるのでしょうか? 下記のテーブルがあり、SELECT文をつくろうと 考えています。 テーブル:foo 項目 PRIMARY KEY INDEX ----------------------------------- a 1 b 2 1 c 3 d 2 (1)PRIMARY KEYを優先してWHERE句の順番を決める↓ SELECT * FROM foo WHERE a = "AAA" AND b = "BBB" AND c = "CCC" AND d = "DDD" (2) それともINDEXが設定されている項目を先に記述する↓ SELECT * FROM foo WHERE b = "BBB" AND d = "DDD" AND a = "AAA" AND c = "CCC" (1)と(2)ではどちらの性能がよいのでしょうか?
- web_ryu
- お礼率53% (21/39)
- Oracle
- 回答数2
- ありがとう数0
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
規格的には、そのような記述はないと思うので、 (1)や(2)で違いが出るとしても、 処理系依存だと思いますので、一概には言えないと思います。(実験してみる価値はあると思う)
その他の回答 (1)
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
オラクルのオプティマイザは、それほど単純な理由で、 索引の利用可否を判断しません。 使うオプティマイザの種類と表/索引の状態により 判断します。 >(1)と(2)ではどちらの性能がよいのでしょうか? (1),(2)ともに同じ結果になるかと思います。
関連するQ&A
- select句副問い合わせ 値の個数が多すぎます
SQL初心者です。 ORACLEで、SELECT句に副問い合わせを付けたところ、ORA-00913:値の個数が多すぎますとエラーになってしまいます。 解決法をご教授願います。 同一テーブルの同一項目を複数項目として取得したいのです。 SELECT (SELECT B.DDD ,B.EEE FROM A_MST A ,B_MST B WHERE A.AAA = B.BBB AND A.BBB = CMST.CCC), (SELECT B.DDD ,B.EEE FROM A_MST A ,B_MST B WHERE A.AAA = B.BBB AND A.BBB = CMST.FFF) FROM C_MST CMST WHERE CMST.A_RYAKU = '123'
- ベストアンサー
- Oracle
- SQL 複数条件を設定
PostgreSQLを使用しております。 それぞれ、TABLE1とTABLE1があり、 TABLE1 a-1 a-2 b-1  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 1 bbb aaa ddd 2 ggg bbb ccc 3 bbb mmm ddd 4 ggg mmm ccc : TABLE2 a-1 a-2 c-1  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 1 bbb aaa eee 2 ggg mmm qqq : 質問1. TABLE1.a-1=TABLE2.a-1 and TABLE1.a-2=TABLE2.a-2 を条件にして結合 したい場合、どのように結合すればよいのか。 期待結果 a-1 a-2 b-1 c-1  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 1 bbb aaa ddd eee 2 ggg bbb ccc ※ 3 bbb mmm ddd ※ 4 ggg aaa ccc qqq ※は空白でもNULLでもよい 質問2. 上記が可能な場合にさらに質問です。 TABLE1およびTABLE2が、SELECT,WHEREによって抽出されたものとした場合、 1つのSQL文で質問1と同様の出力にするにはどのように結合すればよいのか。(はたまた無謀なのか) 知識不足のため悩んでいる状況なので、 どなた様か知識がある方にご教授願いたく思います。
- ベストアンサー
- PostgreSQL
- 複数の条件
名前 G番号 G連番 数量 チーム AAA 1 1 80 1 AAA 2 1 99 1 AAA 3 1 98 1 AAA 3 2 60 1 AAA 4 1 99 1 AAA 4 2 97 1 BBB 1 1 22 2 BBB 2 1 19 2 BBB 2 2 99 2 BBB 3 1 50 2 CCC 1 1 99 1 CCC 2 1 99 1 DDD 1 1 99 1 DDD 2 1 99 1 DDD 1 1 99 2 DDD 2 1 99 2 以上のようなテーブル T_Aがあるとして、以下のような優先順位での抽出条件を考慮した場合のSQL記述方法が分かりません。教えていただけますでしょうか。 名前 "AAA" OR "DDD" ↓ チーム "1" ↓ G番号 "最大"のもの ↓ G連番 "最大"のもの 欲しいレコード 名前 G番号 G連番 数量 チーム AAA 4 2 97 1 DDD 2 1 99 1 以下のようにやってみましたが駄目でした。 SELECT 名前,G番号,G連番,数量,チーム FROM T_A WHERE 名前='AAA' OR 名前='DDD' AND チーム='1' AND (G番号=(SELECT MAX(G番号) FROM T_A)) AND (G連番=(SELECT MAX(G連番) FROM T_A)) 宜しく御願いいたします。
- ベストアンサー
- その他(データベース)
- 複数のテーブルの全てのカラムを一度に検索するには?
検索対象のカラムがid(主キー)、bc1~bc40と41個あります。 1つのテーブルに41個のカラムを作り検索させると非常に時間がかかります。 それにインデックスを全部に付けたいですが16個までしかつけられないです。 なので、5つのテーブルにカラムを分けて全部のカラムにインデックスをつけて それぞれを検索させようと思っています。 テーブルが1つだけなら SELECT * FROM `bc` WHERE `bc1`='あいうえおかき' AND `bc2`='あいうえおかき' AND `bc3`='あいうえおかき' AND ・・・ `bc39`='あいうえおかき' AND `bc40`='あいうえおかき' ORDER BY `bc33` DESC LIMIT 0,50; のようにできますが、テーブルが複数の場合はどうしたらよいのでしょうか。 検索を試す前に下記ができるか試してみました。 SELECT COUNT(*) FROM (((`ccc` INNER JOIN `bbb` ON `ccc`.`id`=`bbb`.`id`) INNER JOIN `aaa` ON `ccc`.`id`=`aaa`.`id`) INNER JOIN `ddd` ON `ccc`.`id`=`ddd`.`id`) INNER JOIN `eee` ON `ccc`.`id`=`eee`.`id` エラーにはなりませんがカウント数が0になってしまいました。 SELECT COUNT(*) FROM (`ccc` INNER JOIN `bbb` ON `ccc`.`id`=`bbb`.`id`) INNER JOIN `aaa` ON `ccc`.`id`=`aaa`.`id` これは正確にできてカウント数100000 SELECT COUNT(*) FROM ((`ccc` INNER JOIN `bbb` ON `ccc`.`id`=`bbb`.`id`) INNER JOIN `aaa` ON `ccc`.`id`=`aaa`.`id`) INNER JOIN `ddd` ON `ccc`.`id`=`ddd`.`id` 4つ目のテーブルを入れたところから無理なようです。 他に良い方法はないのでしょうか。
- ベストアンサー
- MySQL
- 分岐SQLを一発のSQLで実現したい
【データベース:SQLServer2005】 SQLのアドバイスを頂きたいです。 【テーブル】 テーブル名:Table1 フィールド名:種類、キー1、キー2 テーブル名:Table2 フィールド名:種類、キー1、キー2 テーブル名:Table3 フィールド名:種類、キー1、キー2 【データ】 Table1 種類、キー1、キー2 001 AAA BBB 001 AAA CCC 001 AAA DDD Table2 種類、キー1、キー2 002 AAA BBB 002 AAA CCC NULL AAA DDD Table3 種類、キー1、キー2 NULL AAA BBB NULL AAA CCC NULL AAA DDD これをUNIONで取得します。 種類、キー1、キー2 001 AAA BBB 001 AAA CCC 001 AAA DDD 002 AAA BBB 002 AAA CCC NULL AAA DDD NULL AAA BBB NULL AAA CCC 実現したいのは、 1)同種類、キー1、キー2のデータで、 種類にNULLが含まれていたら、NULLのデータは取得しない 2)同種類、キー1、キー2のデータで、 種類にNULLしかないデータは、取得する 001 AAA BBB 001 AAA CCC 001 AAA DDD 002 AAA BBB 002 AAA CCC NULL AAA DDD →いる NULL AAA BBB →いらない NULL AAA CCC →いらない ↓結果 001 AAA CCC 001 AAA DDD 002 AAA BBB 002 AAA CCC NULL AAA DDD 上記を実現する為、UNION後のSQLでも構わないので、 一発のSQLで取得する事は可能でしょうか? 有識者の方にご享受頂ければ幸いです。 どうぞ宜しくお願い申し上げます。
- ベストアンサー
- SQL Server
- SELECT のWHEREに別のSELECT
SELECT のWHEREに別のSELECTの結果を当てはめることは可能でしょうか? ただし、引用テーブルは同じテーブルとします。(DDD) 例 SELECT * FROM DDD WHERE B = (SELECT B FROM DDD WHERE C=1) 再起SQLとはまた違うのでしょうか?
- ベストアンサー
- SQL Server
- エクセルのマクロについて教えて下さい。
エクセルのマクロについて教えて下さい。 Sub Ref() Dim ax As String Dim num As Integer, i As Integer Dim arr As Variant Dim tex As String Range("A1").Select ax = ActiveCell.Formula arr = Split(ax, ",") For i = 0 To UBound(arr) num = i + 1 Cells(num, 1).Value = arr(i) Next i For i = 1 To 10 ActiveCell.Offset(, 1).Select tex = ActiveCell.Formula Selection.Resize(num, 1).Select Selection.Formula = tex Selection.Resize(1, 1).Select Next i End Sub このマクロを10行ほどまで対応させたいです。 例として2行の表ですが、 A B C D E F 1 C100,C101,C102,C103 aaa bbb ccc ddd eee 2 C104,C105,C106,C107 とうい表を、 A B C D E F 1 C100 aaa bbb ccc ddd eee 2 C101 aaa bbb ccc ddd eee 3 C102 aaa bbb ccc ddd eee 4 C103 aaa bbb ccc ddd eee 5 C104 aaa bbb ccc ddd eee 6 C105 aaa bbb ccc ddd eee 7 C106 aaa bbb ccc ddd eee 8 C107 aaa bbb ccc ddd eee という表にしたいです。 結合してから展開しようと考えたのですが 1列目の文字列の最後にカンマが無い場合、ある場合がありまして、 対応する事が出来ませんでした。 マクロ初心者なので教えてください。 よろしくお願いします。
- ベストアンサー
- Windows XP
- IN 句ではインデックスが使用されない?
環境はDB2で現在チューニング作業を担当しています。 ここでWHEREに COL1='AAA' AND COL2='BBB' AND COL3 IN ('CCC','DDD') とある時、COL1、COL2、COL3を含む複合列インデックスを作成したのですが インデックスが使われません。 ※テーブルスキャンになります 上司はIN句があるから仕方ない。。と言うのですがどうも腑に落ちません。 でも確かにIN句をコメントアウトしCOL1、COL2のみで検索すると インデックスを使います。うーんという感じです。 お手数ですがご意見お願いします。。
- 締切済み
- その他(データベース)
- 索引のカラム定義変更(UX→PK)
例)索引IX_aaaのカラムbbbにUX(一意制約)が付いているがあるとします。テーブルはccc このUXをPKに変更する場合はどのようなSQL文を書けばいいでしょうか? 私なりに考えてみたのですが、わからないのでご教授願います。 それと、変更した後で確認するselect文も教えていただきたいです。 (1) Drop index IX_aaa cascade constraint; Create index IX_aaa on ccc(bbb PRIMARY KEY) [TABLESPACE 表領域名]; (2)Alter table ccc MODIFY (bbb PRIMARY KEY);
- 締切済み
- Oracle
- SQL 複数条件を設定
使用言語はjavaで処理しており、 SQL Server2005にて下記のようなテーブル(T_Kekka)があります。 ID a-1 a-2 b-1 b-2 c-1 c-2  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 1 bbb aaa ddd ccc eee fff 2 ggg bbb ccc hhh iii jjj 3 bbb mmm ddd ccc fff eee 4 bbb aaa ccc ddd qqq rrr 5 zzz sss ttt ccc vvv xxx 6 zzz aaa ttt ccc vvv fff 7 zzz zzz zzz zzz zzz zzz 8 qqq rrr ccc ddd fff eee 検索する値は下記の通りです。 検索値 |a-1|a-2|b-1|b-2|c-1|c-2|  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |aaa|bbb|ccc|ddd|eee|fff| 期待値としては、aはaのグループで検索、bはbのグループで検索、cはcのグループで検索をし、 一致個数の多い順に出力したいと考えております。(理想は下記のような感じです。) また、グループ内であれば逆転していてもOKです。 (例えばID:1のaグループのような感じです。) *1 一致数が同じ場合はcグループの数が多いデータが最優先となり、その他はID順になります。 期待値 ID a-1 a-2 b-1 b-2 c-1 c-2 一致数  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 1 bbb aaa ddd ccc eee fff 6 3 bbb mmm ddd ccc fff eee 5 8 qqq rrr ccc ddd fff eee 4・・・*1 4 bbb aaa ccc ddd qqq rrr 4 6 zzz aaa ttt ccc vvv fff 3 2 ggg bbb ccc hhh iii jjj 2 5 zzz sss ttt ccc vvv xxx 1 7 zzz zzz zzz zzz zzz zzz 0 知識不足のため私には複雑すぎて悩んでいる状況なので、 どなた様か知識がある方にご教授願いたく思います。 また、まだテスト段階なので現状のようなテーブル構造にしてしまいましたが、 他のテーブル構造の方がデータが抽出しやすかったり、レスポンスがいい場合がありましたら、 ご教授いただけると助かります。 説明が分かりづらく表が見づらくて申し訳ございませんが、 宜しくお願い致します。
- ベストアンサー
- SQL Server