• ベストアンサー
  • すぐに回答を!

Delphiでサブクエリは可能か

Delphiいやプログラム初心者のものなのですが 困っていますのでどなたか回答願えればと思っております。 Delphiではサブクエリを発行することはできないのでしょうか? 色々試してみてるのですが、「キーワードが無効です'('」のような エラーが出てしまいます。 例えば以下のような場合 SELECT 日付,商品No,商品名,SUM(仕入数) AS 仕入数,SUM(売上数) AS 売上数 FROM ( SELECT siire_date AS 日付,goods_code AS 商品コード,goods_name AS 商品名,SUM(vol) AS 仕入数,0 AS 売上数 FROM SiireData WHERE siire_date >= '2006/05/01' AND siire_date < '2006/06/01' GROUP BY siire_date ,goods_code ,goods_name UNION ALL SELECT delivery_date AS 日付,goods_code AS 商品コード,goods_name AS 商品名,0 AS 仕入数,SUM(vol) AS 売上数 FROM URIAGEDATA WHERE delivery_date >= '2006/05/01' AND delivery_date < '2006/06/01' GROUP BY delivery_date ,goods_code ,goods_name ) サブクエリが無理であれば、一時テーブルを利用しようと考えているのですが・・・わかりません。 Delphi Ver5.0を使って開発しています。 DBはDatabaseDesktop?を利用 どちらの回答でも結構ですのでご教授よろしくお願いします。

共感・応援の気持ちを伝えよう!

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

  • ベストアンサー
  • 回答No.6
  • tkun62
  • ベストアンサー率23% (37/159)

もうひとつ気づいた事が・・・。 サブクエリ内では商品コードとなっていますが 親クエリ内では商品Noになっている。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

あっ本当ですね。。。 お恥ずかしい(汗) やはり下記のクエリでも結果は同じでした。 もうテーブル生成、破棄でいくしかないですね。 本当に助かりました。丁寧な回答ありがとうございました。 これからもっと勉強していきたいと思います。 ありがとうございます。

その他の回答 (5)

  • 回答No.5
  • tkun62
  • ベストアンサー率23% (37/159)

自分が試したものはもっと簡単なクエリ select count(k) from ( select code as k from bukken where kdate = '2006/06/02' UNION ALL select code as k from tyumon where shiten = 4 ) AS A で試したのですが最後の「AS A」が入っていないとご指摘のエラーが出たのですが。 もし上記がダメであればテーブル生成、破棄でやるしかないですね。 テーブル生成(サンプル) create table atbl (a varchar, b int); テーブル削除 drop table atbl; これを通常のクエリを発行するように使います。 属性の指定は色々ありすぎて教え切れません。

共感・感謝の気持ちを伝えよう!

  • 回答No.4
  • tkun62
  • ベストアンサー率23% (37/159)

一応文法を見直してみたら一時テーブルを使わなくても出来るようです。 SELECT 日付,商品No,商品名,SUM(仕入数) AS 仕入数,SUM(売上数) AS 売上数 FROM ( SELECT siire_date AS 日付,goods_code AS 商品コード,goods_name AS 商品名,SUM(vol) AS 仕入数,0 AS 売上数 FROM SiireData WHERE siire_date >= '2006/05/01' AND siire_date < '2006/06/01' GROUP BY siire_date ,goods_code ,goods_name UNION ALL SELECT delivery_date AS 日付,goods_code AS 商品コード,goods_name AS 商品名,0 AS 仕入数,SUM(vol) AS 売上数 FROM URIAGEDATA WHERE delivery_date >= '2006/05/01' AND delivery_date < '2006/06/01' GROUP BY delivery_date ,goods_code ,goods_name ) as A 最後に「as A」を付けただけです。(汗

共感・感謝の気持ちを伝えよう!

質問者からの補足

何度もごめんなさい。 そうなんですよね、本来これでできる。(できなくちゃ困るんですが) どうやらDBが()を嫌うんですよね。 つまり()を使うとSELECTが無効になってしまう 上記方法も試してはみたのですが結果はだめでした。(涙) 現在、一時テーブル作成を模索中です。 なにかわかったら教えてください~ 色々ありがとうございます。

  • 回答No.3
  • tkun62
  • ベストアンサー率23% (37/159)

やりたい事が分かってきました。 この例だと自分の知る限り、やはり一時テーブルを使うしかないのでは無いかと思います。 1.Workテーブル生成 2.クエリ1(結果の結合)=>Work 3.クエリ2(集計) 4.Workテーブル削除

共感・感謝の気持ちを伝えよう!

質問者からの補足

はい!! 私もあれこれやっているうちに一時テーブルを利用するしかないと 思ってきました。 しかし、回答にあるWorkテーブルの生成方法がわからんのです。。。 度々、すいませんがよろしければ回答願います。

  • 回答No.2
  • tkun62
  • ベストアンサー率23% (37/159)

#1です。 よく見たらサブクエリーを使う必要があるのですか? UNIONだけで十分なような・・・。

共感・感謝の気持ちを伝えよう!

質問者からの補足

えーっとまったく未熟者で申し訳ないのですが、 UNIONだけだと、日付で集約できないんです。 上記例で言うとその日の仕入数と売上数を同じ列で取りたいのです。 それと下の回答で頂いたWHEREユニークキーとは?? ごめんなさい。よろしくお願いします。

  • 回答No.1
  • tkun62
  • ベストアンサー率23% (37/159)

SQL自体に問題は無いですか? もし、別のツールでクエリだけを発行できるのなら試してDelphiの問題かSQLの問題かを切り分けた方が良いかと思います。 私の拙い知識だとサブクエリは次のようになると思うのですが。 select 項目列 from テーブル名 where ユニークキー = ( select 対応キー from テーブル名 where 条件 union all select 対応キー from テーブル名 where 条件 )

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • サブクエリについて

    サブクエリが上手く行きません、何が間違ってるのでしょうか? select IODate, (select sum(Price) as "収入" from dailyio where IO='収入' group by IODate) , (select sum(Price) as "支出" from dailyio where IO='支出' group by IODate) from dailyio group by IODate; dailyio------------------------------------- フィールド名 型 Code bigint(20) IODate date IO varchar(255) Koumoku varchar(255) Syousai varchar(255) Memo text Price bigint(20) ----------------------------------------------- ご多忙中とは存じますが宜しくご教授お願いします。

    • ベストアンサー
    • MySQL
  • サブクエリの複数項目

    いつもお世話になっております。 サブクエリで複数項目を取得する方法をご教授下さい。 [既存] select 商品, 価格, (select user_id from user_master where user_id = 1 ) from products where 商品ID = 1 上記のようなSQLがあり、 user_masterから取得する項目をもうひとつ追加したいと思っています。(user_name) select 商品, 価格, (select user_id, user_name from user_master where user_id = 1 ) as user from products where 商品ID = 1 と修正したいのですが、当然エラーになってしまいます。 この場合は別にサブクエリを指定して取得した方がいいのでしょうか。 宜しくお願い致します。

  • 相関サブクエリの中で、グループ化はできない?

    いつもお世話になっています。 オラクルではないのですが、SQLの質問が多く感じたため、質問させていただきました。 タイトルの通り、相関サブクエリはグループ化した状態で行えるのか教えていただきたいんです。 課題は、売上表(Sales)から、売上数量(Quantity)の平均の10倍よりも売上数量(Quantity)の最大の方が大きい商品IDを見つけ出す。というものです。 考えたSQLは SELECT __S1.ProductID FROM __Sales AS S1 GROUP BY __ProductID HAVING __AVG(Quantity) * 10 < (SELECT    __MAX(Quantity)    FROM    __Sales AS S2    GROUP BY    __ProductID    HAVING    __S1.ProductID = S2.ProductID) です。考え方として 相関サブクエリで、現在の商品ID(HAVING S1.ProductID = S2.ProductIDのところ)の商品数量の最大値を比較として返そうと思いましたが、どうもうまくいきません。 こういった相関サブクエリは作れないのでしょうか?

  • MySQLのUPDATE文でサブクエリ

    MySQLのUPDATE文でサブクエリの使い方について教えて下さい。 MySQLのUPDATE文でサブクエリを使うと「#1093 - You can't specify target table 'exam' for update in FROM clause 」というエラーになってしまいます。 「あるテーブルに対してデータを追加・更新する場合、同じテーブルをサブクエリーに使えない」 「サブクエリー内のFrom句はテンポラリテーブルとして扱うことが可能」 ということはわかりましたが、これに従いSQL文を変更してもうまくいきません。 どのようにSQL文を作ったら良いか教えていただければと思います。 環境 PHP:5.1.6 MySQL:5.0.77 ------具体的なSQL文--------------------------------------- テーブル名:sample カラム名:date(DATETIME型),name,flag 上記テーブルに対して、 1.社員(列名:nameのsuzuki)の最新出勤日(列名:date)のflagを1にする 2.社員(列名:nameのsuzuki)の最新出勤日以外(列名:date)のflagを2にする という処理をしたいと思います。 まず、SELECT文を作ってみました。 1.最新出勤日データを抽出 SELECT * FROM sample WHERE (date= (select max(date) from sample)) and name='sizili' 2.最新出勤日以外のデータを抽出 SELECT * FROM sample WHERE not (date= (SELECT max(date) FROM sample)) and name='suzuki' これをUPDATE文に変更すると、 #1093 - You can't specify target table 'exam' for update in FROM clause というエラーになります。 上記をUPDATE文に変更 1.最新出勤日データを抽出 UPDATE sample SET flag=1 WHERE (date= (select max(date) from sample)) and name='sizili' 2.最新出勤日以外のデータを抽出 UPDATE sample SET flag=2 WHERE not (date= (SELECT max(date) FROM sample)) and name='suzuki' エラー文を検索したところ下記のような情報を見つけることができました。 「仕事SPOT」 MySQLでサブクエリ(エラー#1093を回避する方法) http://wsjp.blogspot.com/2009/12/mysql1093.html 「あるテーブルに対してデータを追加・更新する場合、同じテーブルをサブクエリーに使えない」 「サブクエリー内のFrom句はテンポラリテーブルとして扱うことが可能」 と記載されています。 このページに掲載してあるように変更を加えてみました。 1.最新出勤日データを抽出 UPDATE sample SET flag=1 WHERE (date= (select max(date) as test_max from sample)) as text_tb and name='sizili' 2.最新出勤日以外のデータを抽出 UPDATE sample SET flag=2 WHERE not (date= (SELECT max(date) as test_max FROM sample)) as test_tb and name='suzuki' これでもエラーになってしまい、うまくいきません。

    • ベストアンサー
    • PHP
  • サブクエリでのアップデート(MySQL5.5)

    テーブルに事前に記載された数値を用い、べき乗の数値の挿入(アップデート)をしたいと考えています。 *********************************************** やりたいこと *********************************************** テーブル baken umaban___bekijyo___name 1_______NULL____ HOTARUNOHIKARI 2_______NULL____ MADONOYUKI 3_______NULL____ OPPEKEPE 4_______NULL____ KOTARO これをUPDATEして、bekijyo欄に「2のumaban乗」の数値を挿入する。 umaban___bekijyo___name 1_________2_____ HOTARUNOHIKARI 2_________4_____ MADONOYUKI 3_________8_____ OPPEKEPE 4________16_____ KOTARO ************************************************ まずは、べき乗を求めるために下記のSELECT文を作成したところうまくいきました。 SELECT uma_code,umaban FROM (SELECT POW( 2, umaban ) AS uma_code,umaban FROM cbf_today_baken WHERE umaban<'11') AS temp1 umaban___uma_code___ 1_________2_____ 2_________4_____ 3_________8_____ 4________16_____ あとは、上記の2つをくっ付けるだけです。 UPDATE baken SET bekijyo=(SELECT uma_code FROM (SELECT uma_code,umaban FROM (SELECT POW( 2, umaban ) AS uma_code,umaban FROM cbf_today_baken WHERE umaban<'11') AS temp1) WHERE cbf_today_baken.umaban=temp1.umaban) 上記でアップデート可能と思われましたが、エラーになります。 #1248 - Every derived table must have its own alias どこに誤りがあるのかご教授頂けましたら幸いです。

    • ベストアンサー
    • MySQL
  • 同じサブクエリが複数出てくるのでまとめたい

    SELECT a.num b.num FROM   サブクエリA(いろんな処理 WHERE a_id=ANY(サブクエリC(いろんな処理)) ) AS a,   サブクエリB(いろいろ処理 WHERE b_id=ANY(サブクエリD(いろんな処理)) ) AS b このような処理をしているのですが、サブクエリCとサブクエリDは一字一句違わない全く同じ処理をしています。 2回全く同じ処理をするのは処理コストが無駄にかかりますし、同じ内容を示す表記が2度出てくるのは保守性も悪くします。 サブクエリCとDを共通化して一つにまとめる方法はありますでしょうか。

    • ベストアンサー
    • MySQL
  • サブクエリの使い方

    Table t1には t1code|t1type ------------------ 花子|1 太郎|1 一郎|2 次郎|2 五郎|2 Table t2には t2code|date ----------------- 太郎|2012-05-30 太郎|2012-05-30 花子|2012-05-10 花子|2012-05-10 次郎|2012-03-20 五郎|2012-04-10 一郎|2012-03-01 と登録されている場合に t1type毎に一番新しいdateをもつt2codeを抽出したいのです。 そこで、 select t2code,max(date) from t1 inner join t2 on t1code = t2code where (t2code,date) in (select t2code,max(date) as d from t2 group by t2code) group by t1type としたところ、 +--------+------------+ | t2code | max(date) | +--------+------------+ | 太郎 | 2012-05-30 | | 次郎 | 2012-04-10 | +--------+------------+ となります。 本来は、次郎→五郎になってほしいのですが、 どこが悪いのでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • サブクエリ同士をLEFT JOIN

    select SUB1.品番, SUB1.在庫計上セクション, SUB1.倉庫, SUB1.場所, SUB1.在庫数, SUB2.売価変更日付, SUB2.売変単価 from (select 在庫管理RF.在庫計上セクション as 在庫計上セクション , 在庫管理RF.倉庫 as 倉庫, 在庫管理RF.場所 as 場所, 在庫管理RF.品番 as 品番, sum(在庫管理RF.フリー在庫数) as 在庫数 from 在庫管理RF where フリー在庫数 > 0 group by 在庫管理RF.在庫計上セクション, 在庫管理RF.倉庫, 在庫管理RF.場所, 在庫管理RF.品番) SUB1 left join (select 売価変更確定RF.品番 as 品番, max(売価変更確定RF.売価変更日付) as 売価変更日付, min(売価変更確定RF.売変単価) as 売変単価 from 売価変更確定RF group by 売価変更確定RF.品番) SUB2 上記のSQL文が実行できません。 どこがいけないのかもわかりません。 どなたか詳しい方がいればアドバイスお願いします。 使っているTOOLはOSqlEditです。 ACCESSのクエリデザインで同じようにサブクエリを使って実行すると うまくいきます。 よろしくお願いします。

  • サブクエリを使わない方法

    MYSQLのバージョンが4.0の為サブクエリが使えないので非常に困っています。是非お力をお貸しください。 商品コード別に最新の単価を求めるにどうしたら良いでしょうか。 A表 見積No|発行日 ------------------- 00001 |2005/05/01  00002 |2005/05/01 00003 |2005/05/02 00004 |2005/05/03 B表 見積No|商品コード|単価 --------------------------- 00001 | A000001 | 000010 00001 | A000002 | 000020 00002 | A000003 | 000030 00002 | A000002 | 000022 00003 | A000001 | 000012 SELECT A.見積No,A.MAX(発行日),B.商品コード,B.単価 FROM A表 AS A LEFT JOIN B表 AS B ON A.見積No = B.見積No GROUP BY B.商品コード このSQLで日付と商品コードは取得できるのですが、 ここ行き詰まってしまいました。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • サブクエリ 述語のTrue/False

    こんにちは。 サブクエリの勉強をしています。下のURLのサイトを見ていますがわからないことがあります。 http://www.techscore.com/tech/sql/SQL7/07_02.html/#sql76 EXISTS, ANY, ALL はサブクエリが返す値に対して、「TRUE」または「FALSE」の評価を行い、メインクエリの WHERE 句で使用されます。っとあります。 /* EXISTS */ SELECT * FROM 商品表 WHERE EXISTS (SELECT * FROM 商品表 WHERE 商品名 = 'BEER'); 上記のSQLが走り、サブクエリの商品表の中にある、商品名がBEERのモノを抽出しなさいというのは理解できます。理解できないのは、「TRUE」、「FALSE」です。これは1行でも結果が帰ってきたら、それはTRUEとみなされて、EXISITSはサブクエリをTRUEと評価するということでしょうか? つまり、どんな述語でもサブクエリで評価された結果が1行でもあれば、それはTRUEという意味になるのでしょうか?いまいち何がTRUEでFALSEなのかがわかりません・・・宜しくお願いします。