• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQLの高速化)

SQLの高速化

このQ&Aのポイント
  • 重複結果が出力されてしまうクロス結合の問題を解決する方法
  • ARCHIVE_ORDERとARCHIVE_SAMPLEのデータサイズによるパフォーマンス低下を解消する方法
  • 指定の条件で高速な結果を出力するARCHIVE_SAMPLEの検索方法

質問者が選んだベストアンサー

  • ベストアンサー
  • Picosoft
  • ベストアンサー率70% (274/391)
回答No.1

前回の回答を転載しておきます。 > SELECT [mの全てのフィールドの列挙] > FROM Archive_Sample m JOIN Archive_Order o >     ON m.ArchiveID=o.ArchiveID AND m.Order_Sampleid=o.Order_SampleID > WHERE UPPER(o.Order_PatientID) LIKE '%234%' SELECTの後ろにDISTINCTをつけてください。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

【ARCHIVE_SAMPLE】 ArchiveID Order_SampleID 1     2 2     1 【ARCHIVE_ORDER】 ArchiveID Order_SampleID 1     1 2     2 こういうデータがあると抽出結果は2件になっていいんですか? やりたいことはこうじゃないんですかね?? SELECT M.* FROM ARCHIVE_SAMPLE M WHERE EXISTS ( SELECT AO.ArchiveID, AO.Order_SampleID FROM ARCHIVE_ORDER AO WHERE AO.Order_PatientID LIKE '%234%' AND M.ArchiveID = AO.ArchiveID AND M.Order_SampleID = AO.Order_SampleID ) また、LIKEでUPPER()を利用していますが、不要、かつカラムに指定することで インデックスが利かなくなります。

全文を見る
すると、全ての回答が全文表示されます。
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

前回のSQLは決してクロス結合ではないですが・・・。 データの関連性の問題ですよね。 で、別解としてEXISTSを使ってはどうでしょうか。 SELECT * FROM ARCHIVE_SAMPLE M WHERE EXISTS ( SELECT * FROM ARCHIVE_ORDER O WHERE M.ArchiveID = O.ArchiveID AND M.Order_SampleID = O.Order_SampleID AND UPPER(Order_PatientID) LIKE UPPER('%234%') );

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 高速化

    下記SQL文と同一の結果を出力しつつ、高速化は可能ですか? ARCHIVE_SAMPLEとARCHIVE_ORDERが大きくなると著しくパフォーマンスが下がります。 ARCHIVE_ORDERにて検索をかけた結果のArchiveIDとOrder_SampleIDが一致するARCHIVE_SAMPLEを出力したいです。 データサイズとしては、ARCHIVE_ORDER<<ARCHIVE_SAMPLEなので、ORDER側で検索しています。 SELECT * FROM ARCHIVE_SAMPLE M WHERE M.ArchiveID IN (SELECT ArchiveID FROM ARCHIVE_ORDER WHERE UPPER(Order_PatientID) LIKE UPPER('%234%')) AND M.Order_SampleID IN (SELECT Order_SampleID FROM ARCHIVE_ORDER WHERE UPPER(Order_PatientID) LIKE UPPER('%234%')) よろしくお願いいたします。

  • 1つのSQLにしたいです

    1つのSQLにしたいです 以下のSQLを1つにしたいです。 select a, b, c, '1' event_type from sample where type = '1' select a, b, c, '2' event_type from sample where type = '2' select a, b, c, '3' event_type from sample where type = '3' ポイントはselect分に結果によって'1'、'2'、'3'といれたいです。 初心者的質問で申し訳ありません。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLでlike検索条件を副問い合わせ結果にしたい

    SQLでlike検索する際、検索キーワードを副問い合わせの結果文字列とする方法があればご教示下さい。 イメージでは、、、 select A1列 from A表 where A1列 like '(select B列 from B表 where 条件)'; みたいなのが可能であればいいのですが。。。( 宜しくお願いします。

  • SQL 句の評価順

    SQL句の評価順について皆さんの意見をいただけないでしょうか? <ケース1:SELECTが最後> ・FROM ・WHERE ・GROUP ・HAVING ・ORDER ・SELECT <ケース2:SELECTがトップ> ・SELECT ・FROM ・WHERE ・GROUP ・HAVING ・ORDER <ケース3:ORDERの前にSELECT> ・FROM ・WHERE ・GROUP ・HAVING ・SELECT ・ORDER どのケースで評価されますでしょうか? ご教授お願いします。

  • SQL得意な方

    仕事で困っています、 なにとぞお力添えを。 テーブル1から、TOP50 でaとbを表示させたいのです。 で、その際の条件として、 開始するレコードも指定したいのです。 下記SQLの[○]の部分に50が入っていたら、 51~100件を表示する、と、いうような。 SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a で、順調だったのですが、WHERE条件が なんだか怪しいらしく、 a >= ''の時だけはきちんと動くのですが、 ANDでc='1'をつけた所、普通に全件表示されてしまいます。 [ちゃんと51件目から100件目を表示するSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a [何故か全件表示になるSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a ※[何故かNOT IN (~)の部分がまったく働いていない] どうしてなのでしょう?。 解りにくい質問で大変申し訳ないのですが どなたかご教授いただけないでしょうか。

  • あいまい検索の仕方で・・・

    SELECT 担当, 商品, 売上品 FROM TableName WHERE 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 = '竹輪') AND 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 = '胡瓜') AND 売上品 IN ('竹輪','胡瓜') とサブクエリで出したいものが出ますが・・・あいまい検索にしたいと思っています。 SELECT 担当, 商品, 売上品 FROM TableName WHERE 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 like '%竹輪%') AND 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 like '%胡瓜%') AND 売上品 IN ('竹輪','胡瓜') まではわかるのですが売上品 IN ('竹輪','胡瓜')はどうすればよいのでしょうか?

  • SQLで'ABC'をDBの'AB'にHIT

    sqlite3をVC++2013で扱っています。 もしかしたら、単純な方法があるのかもしれないので質問させてください。 DBに渡す文字が'ABC'でDB内のデータ'AB'にHITさせたいと思っています。 現状思いつく方法は select * from テーブル where キー like 'A%'; select * from テーブル where キー like 'AB%'; select * from テーブル where キー like 'ABC%'; と渡す文字を一文字ずつ増やして検索して row数が0以上の一番小さい数のデータを取得するという方法しか思いつかないのですが。 何か良い方法はありますでしょうか?

  • SQLエラー

    検索システムの検索結果の分割をしようとしています。 しかしどうしてもSQL文にエラーがでてしまいます。 SELECT * FROM shops where (area='◯◯◯') ORDER BY id DESC limit0, 10 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'limit0, 10' at line 1 該当するSQL文は以下になります。 $query = "SELECT * FROM shops"; $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where) . ' ORDER BY id DESC '; }   $query .= "limit" . $page_num*10 . ", 10" ; limit句の使い方等間違いはないのかなと思うのですが、いかがでしょうか? アドバイスご教示いただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • mysqlのmatch() against()で検索結果が取得できませ

    mysqlのmatch() against()で検索結果が取得できません。 select * from fulltexttable where match( a ) against( '+ほげ' in boolean mode ) で検索結果は0件ですが、 select * from fulltexttable where a like '%ほげ%' だと検索結果は取得できます。 aカラムにはフルテキストインデックスは貼ってあります。 mysqlのバージョンは5.0.77 hogeテーブルはMyISAM どなたか助けてください。

  • SQL文でエラーが出ます。

    MySQLの事で質問です。 テーブル1~4を結合してフィールド「comment」を検索 する時にフィールド「postDate」の降順でソートしたい のですがエラーが出ました。 「SQLコマンド」 select text from table1 union all select comment from table2 union all select comment from table3 union all select comment from table4 where match(commentIndex) against("検索ワード" in boolean mode) order by postDate desc; 試しに union all select comment from table2 union all select comment from table3 union all select comment from table4 の部分を削除して実行してみた所、成功しました。 後、order by postDate desc;のみ削除した場合でも成功しました。 エラーの内容はこれです↓↓ Unknown column 'postDate' in 'order clause' フィールド「postDate」は存在します。 (varchar型何ですが、それがいけないと思い date型やdatetime型と変えてみましたがダメでした) 何とかソートしたいのですがどうすればいいのでしょうか?

    • ベストアンサー
    • MySQL