• ベストアンサー

SQLの副問い合わせについて

SELECT (副問い合わせ).a, (副問い合わせ).b, (副問い合わせ).c, (副問い合わせ).d FROM TableA ※副問い合わせの抽出条件は同じ このように同じ副問い合わせが複数あるとそれだけ処理が重くなるのでしょうか? どうしたら一つにまとめることができるのでしょうか?

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

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.2

 この情報では、出来ることもあれば出来ないこともある。効率が悪いこともあるしそれが最善であることもある。  としか書けないです。答えになってませんよね(苦笑)  そうですね。あなたが書いたselect文を全部省略せずに書いてください。テーブル名とフィールド名は適当に変えてもかまいません。でもそれ以外の分は何も変えずに省略せずに書きましょう。  又は、テーブルの定義と、あなたが求める結果を日本語で省略せずに書いてください。この場合は、出来れば、フィールド名・テーブル名も変えて欲しくないですね。最低でも、あなたが求める答えを作るのに必要なテーブル間・フィールド間の関係が解るだけの説明が必要です。  フィールド名やテーブル名がそのまま全部出せるならどちらでもかまいませんが、名前が事情により出せないのであれば、前者の方が簡単でしょう。  ここまで出てくれば、たくさんの人がいろいろな方法を提示してくれるでしょう。

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

その他の回答 (3)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.4

> SELECT tableA.a * (select 1 from tableB) > tableA.b * (select 2 from tableB) > FROM > tableA このようなSQLは文法エラーで通りません。

全文を見る
すると、全ての回答が全文表示されます。
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.3

> SELECT tableA.a * (select 1 from tableB) > tableA.b * (select 2 from tableB) > FROM > tableA まだ他に何かやってませんか? SELECT tableA.a * 1, tableA.b * 2 FROM tableA にみえてしまいます。

全文を見る
すると、全ての回答が全文表示されます。
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

FROM TableAだけで良いのですか? その「副問い合わせ」は何をしてるんですか? > どうしたら一つにまとめることができるのでしょうか? 「一つにまとめる」とは、以下みたいなことですか? SELECT TableA.ID, a.ID, b.ID, c.ID, d.ID FROM TableA, (select ID, ........ ) AS a, (select ID, ........ ) AS b, (select ID, ........ ) AS C, (select ID, ........ ) AS d where ... ;

110110110110
質問者

補足

回答ありがとうございます。 説明が下手で申し訳ないです。 >その「副問い合わせ」は何をしてるんですか SELECTのselect_exprで使うための値をとってきています。 SELECT tableA.a * (select 1 from tableB) tableA.b * (select 2 from tableB) FROM tableA 結合をつかえば1回の問い合わせで済むのでしょうか?

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

関連するQ&A

  • Oracle SQL DELETE文のレスポンス

    いつもお世話になっております。 この度は、手前のSQL文において DELETE文のレスポンスが上がらずに難儀しています。 現在DELETE処理はバッチにて行っています。 最初にSELECTにて抽出を行ったものをバックアップにとり、 次は同様の条件でDELETE文で処理しています。 この際に、SELECTでは1秒程度で済んだ処理が、 DELETE文ではレスポンスが返ってこないという状況です。 何がまずいのか、どう工夫すればいいのか 色々変えてみましたがレスポンスは改善されません。 SQLと条件は以下です。 【SQL文】 SELECT 複数の項目 FROM TABLEA A WHERE NOT Exists(SELECT 'X' FROM TABLEB B WHERE A.ITEMNO = B.ITEMNO) AND NOT Exists(SELECT 'X' FROM TABLEC C WHERE A.ITEMNO = C.ITEMNO AND to_char(LAST_DAY(ADD_MONTHS(SYSDATE,-4)),'YYYYMMDD') < C.REPYMD) AND NOT Exists (SELECT 'X' FROM TABLEA2 A2 WHERE A.ITEMNO = A2.ITEMNO AND to_char(LAST_DAY(ADD_MONTHS(SYSDATE,-4)),'YYYYMMDD') < to_char(A2.CREATEDATE,'YYYYMMDD')) AND NOT Exists(SELECT 'X' FROM TABLEC C WHERE A.ITEMNO != C.ITEMNO AND to_char(LAST_DAY(ADD_MONTHS(SYSDATE,-4)),'YYYYMMDD') < to_char(A.CREATEDATE,'YYYYMMDD')) 上記のSELECT文の後に処理されるDELETE文は 「SELECT 複数の項目 FROM TABLEA A」 ⇒ DELETE FROM TABLEA A としたもので、 条件は全てSELECT文と同様のものを使用しています。 ◆条件を言葉で明記すると以下のようになります。 1.Bテーブルに存在するものは削除対象外とする 2.AテーブルのアイテムIDとCテーブルのアイテムIDは一致する。   AテーブルのCREATEDATEとCテーブルのREPYMDのいずれかが3ヶ月以内のアイテムは   削除対象外とする 3.AテーブルもしくはCテーブルにしか存在しない場合は、各日付が3ヶ月以内のアイテムは   削除対象外とする 以上のようになっています。 どなたかアドバイスをいただければ幸いです。 宜しくお願い致します。

  • PLSQLで条件によりSQLを動的に変えたい

    例えば、あらかじめテーブルなどを読み、その内容により、 SQLの文そのものを非常に変えたいとします。 SQLその1 select * from TABLEA where A = 1 SQLその2 select * from TABLEA where A = 1 and B = 2 and C = 3 and D = 4 上記は例ですが、内容などにより複雑な条件式を追加したい。 ベースのSQLは非常に長い為、 例えば 完全に切り分けるのでは無く、共通の部分は共通ソースとしたい。 また、プリプロセッサみたいに、条件式が追加された場合 あたかも、初めからそのSQLのみがあり、他の制御文などをSQL文自身には追加したくない。 動的SQLでは無い方法でそのような事が可能でしょうか? ----- イメージ ----- select * from TABLEA where A = 1 IF (条件がある時のみ) B = 2 and C = 3 and D = 4 END IF; ------------------- 実際には、SQL文の中にPLSQLの制御文をうまく追加できない。

  • 副問い合わせ?について。

    ASPとAccessを使って書籍検索サイトの作成の勉強をしています。 以下のような複数のテーブルがあります。 BooksDataをPublishTypeで抽出し、更にCategoryIDで抽出した結果のTableAの内容を全て表示するにはどういったSQLを書けばよいのでしょうか。 単純に "SELECT * FROM BooksData WHERE PublishType=3" といった問い合わせは成功しました。 [TableA] BookID ISBN Title PublishType [TableB] BookID(主キー) CategoryID(主キー) [TableC] CategoryID CategoryName

  • SQL 副問い合わせ

    以下のaテーブルのcardidと、bテーブルのnoが同じで、 かつ、bテーブルのryodtmが前月のデータを抽出する以下のsqlを、 aテーブルのcardidが、bテーブルのnoと同じで、かつ、ryodtmが前月分、 または、cテーブルのchangcardと同じで、かつ、ryodtmが前月分のを抽出する場合、 どうすればいいでしょうか? select * from a where cardid in ( select distinct(no) from b where kdncresbt ='1' and ryodtm >= TO_CHAR(ADD_MONTHS(TRNC(SYSDATE,'MONTH'), -1),'YYYYMM' ) || '01' and ryodtm < TO_CHAR(SYSDATE,'YYYYMM') || '01' )

  • PHP SQL 問合せについて

    PHP SQL 問合せについて http://okwave.jp/qa/q7689206.html での質問の続きとなります。 No,name 1,ばなな 2,りんご 3,ばなな 4,みかん 5,ばなな 6,りんご 上記テーブルで 1,ばなな 3,ばなな 5,ばなな 2,りんご 6,りんご 4,みかん の結果を得るSQLはどのように記述すればよいでしょうか? 回答 select * from tableA x order by (select count(*) from tableA y where y.name = x.name ) ,No で解決していますが、 select * from tableA x where name ='果物' とした場合、結果が異なります。 (結果が多い順にならない) 出現回数が多い順に並べるには、どのような記述になりますか? データには「果物以外のデータが含まれている」とします。 宜しくお願い致します。

    • 締切済み
    • PHP
  • あいまい条件抽出についてのSQL文について

    あいまい条件抽出についてのSQL文について hiroです。 SQL文について、教えてほしいのですが、 下記のようなDatabaseがあったとします。 tableA:カラムA:ABCDE,BCDEA tableB:カラムB:??C?? この場合、例えば、 SELECT * FROM DataBase WHERE tableA.カラムA like tableB.カラムB みたいな感じで、カラムAのABCDEだけを検索するような仕組みを作ることは 可能でしょうか? ※上のSQL文では引っ張れないのは理解できています。 わかる方がいらっしゃいましたら、SQL文を教えてください。 よろしくお願いします。 環境:Oracle 11g

  • SQL の抽出方法

    あるテーブルABC に項目aとbとc があるとします。 今、抽出の条件が 仮にa=1,b=2 として、 この条件で複数件のデータが抽出され その中からcが最大のデータ1件のみを抽出するとします。 このSQLを作成する場合、 どのような方法がありますでしょうか? select文で、1度cのmax値を求めないといけないでしょうか?

  • SQLでlike検索条件を副問い合わせ結果にしたい

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

  • XML型に対する問い合わせ

    以下のような(1)と(2)のxml型を値を持つレコードがある場合にbの中でcとdが両方1の場合だけ検索((1)のレコードだけが欲しい)するようにはどのように問い合わせればば良いでしょうか? (1) <a>    <b><c>1</c><d>1</d></b>   </a> (2) <a>    <b><c>1</c><d>0</d></b>    <b><c>0</c><d>1</d></b>   </a> 自分で考えた問い合わせだと(1)と(2)の両方のレコードが返ってきてしまいます。 select * from test where   '1'=ANY(xpath('/a/b/c/text()',xml)::text[])   AND '1'=ANY(xpath('/a/b/d/text()',xml)::text[])

  • sqlについて

    下に書いたsqlのコードの内容(どういう処理でどういう結果になるのか)が知りたいです。 どなたかわかる方教えてください。 select b.ym, b.no,     isnull(e.sumcnt,0)as val, null as bunsi, null as bunbo from (select distinct ym,no from Table_A)b inner join (select ym from Table_B where cd=1)d on b.ym=d.ym left outer join (select b1.ym,b1.no,sum(c1.cnt)as sumcnt from Table_A b1 inner join (select ym from Table_B where cd=1)d1 on b1.ym=d1.ym inner join Table_C c1 on b1.ym=c1.ym group by b1.ym,b1no)e on b.ym=e.ym and b.no=e.no