• ベストアンサー

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

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

  • oen
  • お礼率58% (7/12)

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

  • ベストアンサー
回答No.2

恐らくCategoryはIDではなくNameで検索したいと思いますので、その場合は以下のようになります。 SELECT A.*  FROM TableA as A, TableB as B,TableC as C  WHERE A.PublishType=3 AND C.CategoryName = "XXX" AND A.BookID=B.BookID AND B.CategoryID = C.CategoryID

oen
質問者

お礼

大変参考になりました。ありがとうございました。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

SELECT TableA.* FROM TableA as A, TableB as B WHERE A.PublishType=3" AND B.CategoryID="XXX" AND A.BookID=B.BookID; って感じでいけると思います。

関連するQ&A

  • SELECT文の発行でタイムアウトします

    以下のようなテーブルがあります。 BooksDataテーブルのBookIDから、 BooksCategoryテーブルのCategoryIDを調べ CategoryNameを表示したいと考えておりますが SELECT文が実行中にタイムアウトになってしまいます。 何か悪いところはございますでしょうか。 [BooksData] BookID ISBN Title [BooksCategory] BookID CategoryID [BooksM_Category] CategoryID CategoryName SELECT BMC.* FROM BooksM_Category AS BMC, BooksCategory AS BC WHERE BookID=XXX AND BMC.CategoryID=BC.CategoryID

  • 複数表での集計値について

    以下のようなテーブル構造。SQLで 集計値を求めたいのですがCNTの値が tableCの件数を取得してしまいます。 (取得したいのはtableA.ID毎のtableB.ID2の件数) 宜しくお願いします。 ・tableA ------------- ID ------------- ・tableB ------------- ID | ID2 ------------- ・tableC ------------- ID2 | TIME ------------- SELECT tableA.ID ,SUM(tableC.TIME) AS TIME ,COUNT(tableB.ID2) AS CNT FROM tableA,tableB,tableC WHERE tableA.ID = tableB.ID AND tableB.ID2 = tableC.ID2 GROUP BY tableA.ID

    • ベストアンサー
    • MySQL
  • 3つのテーブルを結ぶSQLの書き方

    お世話になります。 3つのテーブルを結びつけるSQLの書き方がわかりません。ご指導お願いします。 [TableA][ID] [TableB][ID] [TableC][ID] [TableA]と[TableB]をLEFT JOINでつなぐ。 上の結果を[TableA][ID]と[TableC][ID]でInner joinでつなぐ。 つまり・・・ SELECT TableA.ID,TableB.ID FROM TabelA LEFT JOIN TableB→この結果 SELECT TableA.ID,TableB.ID TableC.ID From この結果 INNER JOIN TableC ON TableA.ID = TableC.ID こんな感じのことをやりたいのですが、記述の方法がわかりません。 どなたかお知恵をお貸しください。

  • 1つのテーブルから複数のテーブルへのデータ振分け

    MySQLを使用して、tableAというテーブルのデータを tableB,tableC,tableDというテーブルに振り分けたいと思っています。 1日1回、自動的に行いたいと思っています。 たとえば、tableAのテーブル構成が下記のようなもので ================== name sex birth address phone email company ================== name,address,phoneはtableBに name,sex,birthはtableCに name,companyはtableDに分けるというような イメージです。 私の考えでは、下記のようなSQL文をPHPから呼び出して、タスクで 実行させてそれぞれ別のテーブルに振り分けようと思っている のですが、、もっと良いツールや方法があればお教えいただけ ませんでしょうか。 宜しくお願いいたします。 ---------------------------------------------------------------------------------------------------- INSERT INTO tableB (name,address,phone) SELECT tableA.name,tableA.address,tableA.phone FROM tableA AND INSERT INTO tableC (name,sex,birth) SELECT tableA.name,tableA.sex,tableA.birth FROM tableA AND INSERT INTO tableD (name,company) SELECT tableA.name,tableA.company FROM tableA; ----------------------------------------------------------------------------------------------------

  • SQL:テーブル結合で該当レコードがない場合

    SELECT TableA.ID,SUM(TableA.量),TableB.金額 FROM TableA,TableB WHERE TableA.ID = TableB.ID GROUP BY TableA.ID,TableA.量,TableB.金額 こんな感じのSQLなんですが TableAをメインテーブルとして ↓のような結果を得るように作り変えれないか考えています ■TableBとの結合レコードあり(金額登録あり) 1,50,1500 ■TableBとの結合レコードあり(金額登録なし) 1,50,(NULLかスペース) 考えているんですが思いつかないのでヒントいただけたらと思います。宜しくお願いします。

  • SQLiteのUPDATE文を教えてください。

    UPDATE tableA, tableB SET tableA.name = tableB.name WHERE tableA.id = tableB.id; 上記のSQLが他のデータベースでは動きますが、SQLiteでは動きません。 同意味のSQLはどう書くのでしょうか。お願いします。

  • 特定のテーブルを除いたバックアップ

    データベース名をsampleとしますとバックアップのコマンドは mysqldump --password='xxxxx' sample > backup.sql となるのですが、このデーターベースの特定のテーブルを除いたものをバックアップしたいのですが どうすればいいのでしょうか? 以下のようにテーブルを個別に指定してひとつひとつコマンドを発行するしかないのでしょうか? mysqldump --password='xxxxx' sample tableA > tableA.sql mysqldump --password='xxxxx' sample tableB > tableB.sql mysqldump --password='xxxxx' sample tableC > tableC.sql よろしくお願いします。

    • ベストアンサー
    • MySQL
  • ループがうまくいかない

    以下のようなテーブルがあります。 BookID,CategoryIDは一意な値です。 BooksDataをある条件で抽出するSQLを発行した際、 例えば300番のBookIDにはCategoryIDが複数あると 結果は300のレコードが複数分表示されます。 BooksIDが同じ値の場合、nextして、重複しない値になるまでnextさせ、結果としてBooksIDの値が重複しない結果を表示したいと考えております。 しかし、内側にあるDoWhile-Loop文で不明なエラーとなります。外側のDoWhile-Loop文をコメントアウトされると正常にnextできているようです。原因について推測できることはございますでしょうか。 [BooksData] BookID ISBN Title [BooksCategory] BookID CategoryID [BooksM_Category] CategoryID CategoryName Do While Not rs1.EOF 'BooksDataを表示 Response.Write("BookID:") Response.Write(rs1("BookID")&"<br>") '300番がはいっている bid = rs1("BookID") 'ここでエラーになる Do Until rs1("BookID") > bid rs1.MoveNext '最初のDoWhile-Loopをコメントアウトされると301が表示される。 'Response.Write(rs1("BookID")) Loop Loop

  • 3つのテーブルから値を取得する

    お世話になっております。MySQL 4.1.20 phpMyAdmin 2.6.0-pl3 です。 tableCのcityname='BOS'で、f_kubun='B'を出し、tableBのadd_charge='5000'とtableAのa_fare=80000 を合計したいのですが、やり方がまずいのか、件数が多いのか途中で止まります。 まだ、 tableC.f_kubun=tableB.c_kubun もできていない状態です。 テーブル tableA 約40000件 t_code | t_from | t_to | a_fare xx45cc |20070209|20070220| 80000 xx45cc |20070220|20070331| 70000 テーブル tableB 約20000件 t_code | c_kubun | add_charge | xx45cc |A | 0 | xx45cc |B | 5000 | テーブル tableC 約120000件 t_code |cityname |f_kubun|rtng|stop_o| xx45cc |NYC | A | 0 | 1 | xx45cc |BOS | B | 0 | 1 | $cityname='BOS'; $day='20070210'; 欲しい答え85,000 $sql = "select add_charge,a_fare from tableA inner join (tableC inner join tableB on tableC.t_code = tableB.t_code) on tableA.t_code = tableB.t_code where t_from<='$day' and t_to>='$day' and a_fare>0 and cityname='{$cityname}' and rtng='0' and stop_o='1'"; とまってしまうので、あっているかどうかもわからないのですが やはりやり方が悪いのでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • あいまい条件抽出についての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