• ベストアンサー
  • 困ってます

【初歩的な質問ですが・・・】 SQL文書き方がわかりません

SQLの知識に乏しい者です。 よろしくお願い致します。 ●テーブルA ・会計コード ・年度 ・部署番号 ・社員番号 ・その他幾つかのデータ ※Where句で「年度>2002年」以降を抽出 のテーブルがあります。 この時、Bテーブルで ●テーブルB ・会計コード(主キー) ・年度 ・部署番号(主キー) ・社員番号(主キー) ・その他幾つかのデータ ※Aテーブルで抽出されたデータの中から絞り込む というテーブルを抽出するSQL文を組みたいのですが、効率の良いやり方がわかりません。 副問合せで  Select [B表で抽出した列名…]  From B表  Where 会計コード = (Select 会計コード               From A表               Where 年度 > '2002')  AND 部署番号 = (Select 部署番号             From A表               Where 年度 > '2002') ・・・・以下省略 の様に書くと効率が悪い気がしました。 (実際には、副問合せが6個書くことになるため) 良い書き方を知っている方がいらっしゃいましたら、よろしくお願い致します。

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

  • 回答数2
  • 閲覧数121
  • ありがとう数3

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

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

もしかして select * from B where (会計コード,部署番号) in (select 会計コード,部署番号 from A where 年度>'2002') ということ?(オラクルは複数項目を一度に比較できます) でも、質問に書かれているSQLとは、違った結果になるような気がします。 (質問に書かれたSQLが適切でない気がする)

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

質問者からのお礼

早速のご返答ありがとうございます。 質問するカテゴリが違いました。すいません。 今使っているのは「SYBASE」です。 OLACLEとほぼ変わらないと思って、ここに書いてみたのですが。 ですので、カテゴリを変えます。 select * おそらく、「in」は使えないですよね・・・ マニュアルで見たら載っていなかったので。 質問に書いたSQLはわからないなりに、 書いてみたので間違っているのかもしれないですが、 私が求めているのはk_o_r_o_c_h_a_nさんが書いてくれたSQL文です。 もし、SYBASEでの書き方がわかればよろしくお願い致します。

関連するQ&A

  • SQLの構文で質問です。

    いつもお世話になっております。 SQLの構文で質問です。 テーブルを開いて、データの中から日付を絞って抽出したいのですが、 whereの後にどのような記述をすればいいのかわかりません。 なんとなく『>』を使ってやってみましたがうまく抽出できませんでした。 例えば、2008/12/01~2008/12/31の絞りで抽出できるようにしたいのですが。 SELECT * FROM 日付 WHERE (日付   2008 / 12 / 01    2008 / 12 / 31) すみません、SQLを使い始めて間もなく本を見てはいるのですがうまくいかないもので。 宜しくお願いします。

  • 絞込みする時のSQLの書き方

    お世話になります。 絞込みする時のSQLの書き方について教えてください。 具体的には テーブル名tbl01,フィールド名f01,f02とした場合 1.f01もしくはf02にAという文字を含むレコードを抽出。 SQL = "select * from tbl01 where f01 like '%A%' or f02 like '%A%'" 2.続いて、1で抽出したデータからf01もしくはf02にBという文字を含むレコードを抽出するSQL文 SQL = ????? あくまでも、1と2を満たす条件を1つのSQL文で表す方法です。一旦、1の結果をワークテーブルに落とし、そこから2だけのSQL文を実行するわけではありません。

  • SQL文の書き方

    お世話になっております。 現在、SQLServer2000(SP4)を使用しています。 次の結果を求めるSQL文を作りたいのですが、中々上手く行きません。 良い方法を教えて下さい。 あるテーブル(tableA)にレコードが以下のようにあるとします。 【基本コード】【大分類】【中分類】    1      1    3    1      1    4    1      2    1    2      1    99    2      18    1    3      3    2 やりたい事は、【基本コード】毎に、【大分類】【中分類】の最小値を取得したいので、下記の結果を得たいのですが、 期待する結果↓ 【基本コード】【大分類】【中分類】    1      1    3    2      1    99    3      3    2 現在考えているSQL文では、下記のようになってしまいます。 実際の結果↓ 【基本コード】【大分類】【中分類】    1     1     3    2     1     3    3     3     3 現在考えているSQL文↓ SELECT  基本コード,  MIN(大分類) AS 大分類,  (SELECT MIN(中分類) FROM tableA WHERE 大分類 = (SELECT MIN(大分類) FROM tableA) GROUP BY 大分類) AS 中分類 FROM tableA GROUP BY 基本コード 中分類を求める場合の、大分類の指定の仕方が悪いのはわかるのですが、どう直したら良いのか分からず困っています。 宜しくお願いします。

その他の回答 (1)

  • 回答No.2
  • kaiu
  • ベストアンサー率20% (65/315)

今oracle環境無いので分かりませんが。 ■select [B表列名、B表列名…] from B表 where (select [A表.会計コード,A表.部署番号,…] from A表 where A表.年度 > '2002') ■select [B表列名、B表列名…] from B表 where B表.会計コード = A表.会計コード and A表.部署番号 > '2002' どちらかでどうでしょうか。 間違ってたら適宜修正してください。 色々作成したものはコマンドプロンプト上でsql*plusを使って set time onコマンドを書いてスクリプトを実行させて時間を計って見るといいと思います。 何でも書いてみて実験してみると結構勉強になりますよ。

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

質問者からのお礼

早速ありがとうございます。 下記にも書いた通り、SYBASEというものを使っているのです。 カテゴリが違うので、試して出来なければまた質問させて頂きます。 アドバイスありがとうございました。

関連するQ&A

  • SQL文について

    SQL文について 現在一度に検索ができずに困っているため質問します。 データベースに男性テーブルと女性テーブルがあります。 男性テーブル ・番号 ・名前 女性テーブル ・番号 ・名前 このテーブルより自分の父、母、母の父を表示させたいのですが SELECT 男性テーブル.名前, 女性テーブル.名前, (※母の父を表示させたい) FROM 男性テーブル, 女性テーブル WHERE 男性テーブル.番号=父の番号 AND 女性テーブル.番号=母の番号 このあと条件に (AND 男性テーブル.番号=母の父の番号) をつけることはできないためSQL文の書き方で困っています。 抽出データは複数なので※の部分にサブクエリを書くことができません。 何かよいSQLの書き方はありますでしょうか?

  • SQL '%@'とは?

    こんばんわ。 SQLの質問なのですが、 SELECT * FROM aテーブル WHERE aテーブル.番号 IN '%@' というSQL文が 学校で使われていましたが、 '%@'とは何を指すのでしょうか? 調べても分からなかったので ご教授願います。

  • SQL文で質問

    SQL文で質問 いつもお世話になっております。 SQL文について質問です。 仮にですが、商品マスタというテーブルと、対応テーブルという二つのテーブルがあります。 対応テーブルには、商品コードが親コード、子コードといった形で構成されています。 対応テーブルのいくつかの親のコードを条件に、親コードと子コードを検索して、それぞれの商品名を検索したいと思っています。 現在、SQL文で、親コードに対応した商品名だけを取得しているのですが、子コードに対応する商品名も検索したいと思っています。 現在のSQL分としては、 SELECT 対応テーブル.親コード、商品マスタ.商品名、対応テーブル.子コード FROM 対応テーブル,商品マスタ WHERE 対応テーブル.親コード = 商品マスタ.商品コード AND 対応テーブル.親コード = 1000,1002,1004 このSQL文で検索した子コードで、商品マスタの商品名を検索したいのですが、どのようなSQLを書いたらよいのでしょうか。 ご教授願います。

  • SQL文を勉強し始めたのですが質問です。

    受講履歴表(研修コード、社員番号、評価)と、社員マスター(社員番号、氏名、部署番号)という2つの表があるときに、次の2つのSQL文はどちらでも同じでしょうか?それとも違う意味があるでしょうか? SELECT 社員マスター.社員番号, 研修コード, 評価, 氏名 FROM 受講履歴表, 社員マスター WHERE 受講履歴表.社員番号 = 社員マスター.社員番号 SELECT 受講履歴表.社員番号, 以下は上と同じ。 それから、もう一つ分からないのは、アクセスの講習を受けたときは、選択クエリを作るときは、多側のテーブルのフィールドを選んだのですが、SQLの教科書では、社員マスターのフィールドを選ぶように書いてありました。でも理由が書いていないので、なぜそうなのか、よくわかりません。 アクセスの選択クエリと、上のSQL文では、意味が違うのでしょうか?どなたかわかる方、教えていただければありがたいです。

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

    SQLの勉強をし始めて間もありませんが、以下のSQLについて教えてください。 実はこの問題は昭晃堂発行の北川博之先生が書いた「データベースシステム」という本に乗っている問題です。以下のようなデータベースがあります。 部門(_部門番号,部門名) 部品(_部品番号,部品名) 業者(_業者番号,業者名,住所,電話番号) 従業員(_従業員番号,従業員名,氏名,住所,年齢) 供給(_部門番号,_部品番号,_業者番号,単価,数量) _がついているのは主キー この中で、登録されているすべての部品の供給を受けている部門の部門番号を表示するSQLを記せという問題があります。 つまり、部品表の供給テーブルの中の部門番号ごとに、供給テーブルのなかに含まれる部品番号と部品テーブルの部品番号がすべて一致するかを調べるSQLを書かなければならないということです。 まったく歯が立たないので、いろいろと調べた結果、 SELECT DISTINCT 部門番号 FROM 供給 AS 供給1 WHERE NOT EXISTS( SELECT * FROM 部品 WHERE NOT EXISTS( SELECT * FROM 供給 AS 供給2 WHERE 部品.部品番号=供給2.部品番号 AND 供給1.部門番号=供給2.部門番号 )); が正解であるということでした。 しかし、NOT EXISTSが2回も出てくるばかりか、副問い合わせの連続で頭が混乱してよく理解できません。 このSQL文について、具体的にはどのようなことをやっているのでしょうか?教えてください。お願いします。

  • このSQL文の意味を教えてください。

    SQL勉強中の者です。このSQL文の意味を教えてください。 SELECT A.* FROM table AS A, table AS B WHERE A.id *= B.id AND A.flag = 1 tableにAとBという別名をつけて、Aの全ての項目を抽出しているというところまでは分かりました。 分からないのは「WHERE A.id *= B.id」の部分です。ただの「=」なら分かりますが「*=」って何ですか? あと、AとBのテーブルが同じなのですが、同じテーブルを2つ並べている意味がよく分かりません。 よろしくお願いします。

  • SQL ?で終わる

    アクセスのSQL文で、テーブルのフィールドの値が、最後が?で終わるものを抽出したいのですが SELECT テーブル.フィールド FROM テーブル WHERE (((テーブル.フィールド) Like "[*?]")); これだと1件も抽出されません。 Like "[*?]"が間違ってると思うのですが、どうすればいいでしょうか?

  • SQL文について

    OracleやSQLについてはまだ初心者のレベルで理解が浅いので言葉足らずかもしれませんがよろしくお願いします。 以下のようなテーブル(名称:TBL)があったとします。 SHOP_CODE------SHOP_NUMBER----MONEY1------MONEY2 A ---------------- 1 ---------------- 100 ------------- 200 B ---------------- 2 ---------------- 300 ------------- 400 C ---------------- 3 ---------------- 500 ------------- 600 D ---------------- 4 ---------------- 700 ------------- 800 例えば、SHOP_CODEがA~Dのどれかの行(レコード)はそのまま抽出して、残った行(レコード)はMONEY1およびMONEY2を0に変更して抽出しようとした場合、 SELECT * FROM TBL WHERE SHOP_CODE = 'ここはA~Dのどれかを代入' UNION SELECT SHOP_CODE, SHOP_NUMBER, 0, 0 FROM TBL WHERE SHOP_CODE <> 'A~Dのどれかを代入' このようなSQL文を考えてみました。 しかし、比較的簡単な例ならばよいのですが、UNION前のSELECT文が複雑になってきた場合のことを考え以下のような文の作りかたができないかと思いました。 SELECT * FROM TBL WHERE SHOP_CODE = 'ここはA~Dのどれかを代入'・・・『この時点で抽出した塊になんらかの名称をつける(例:tbl)』 UNION SELECT SHOP_CODE, SHOP_NUMBER, 0, 0 FROM TBL WHERE SHOP_CODE <> tbl.SHOP_CODE・・・『このようにUNION以前に抽出した塊の名称を利用して条件を作成』 このような方法ができるとした場合、前段階で抽出した塊にどのような方法で名称をつけるのか分かりませんでした。(汗)そもそもできるかどうかもわかりませんが、、、(^^; 最初のSQL文がベターな方法なのかも分かりませんが、上記に示した方法で抽出することが可能でしょうか?もしできるのならば、前述したように名称をつけて条件を作成する方法等を教えていただきたいと思います。 おおよそ話を分かっていただければよいのですが、ものすごく簡単に言うと一つのテーブルのある行とある行に別々の処理をして再構成したいというようなイメージです。(今回はMONEYを0にすると仮定しました) できれば上記の方法に沿った考えで回答をいただけると私も助かりますが、もっと良い方法があれば是非伺いたいと思います。お時間の方ありましたらよろしくお願いします。

  • SQL文で質問です

    SQL文で質問です。 テーブルA X NUMBER型 Y DATE型(年月日と時間) テーブルB Z NUMBER型 W DATE型(年月日) A,BをAを主テーブルとして外部結合し、同じ年月日でBには無いデータ を取得したいのですが、 SELECT A.X FROM A,B WHERE A.X = B.Z(+) AND A.Y = B.W(+) AND B.Z IS NULL; というSQL文を実行すると、テーブルAには時間まで登録されているので 実際には取得したいデータが存在しても 「レコードが選択されませんでした」 になってしまいます。このため、 SELECT A.X FROM A,B WHERE A.X = B.Z(+) AND TO_DATE(A.Y,'YYYY/MM/DD') = TO_DATE(B.W,'YYYY/MM/DD')(+) AND B.Z IS NULL; としてみたところ、今度は3行目で 「ORA-00936: 式がありません」 というエラーになってしまいます。 外部結合にしたことがエラーの原因のようなのですが、DATE型の項目を キーにして外部結合にするにはどうすれば良いのでしょうか?

  • SQLのSELECT文教えてください。

    VB5.0で、DBはSqlServer2000です。 SQL文のSELECT文で質問です。 ○A_TABLEの構成(概略) ・・・担当コード1・・・担当コード2 ○TANTO_TABLE 担当コード/担当名 (質問)TANTO_TABLEからA_TABLEの担当コード1と担当コード2の担当名を抽出したいのです。 次のSQLだと担当コード1のみしか抽出できません。 効率よく担当コード1と2の担当名を抽出するSQLを教えてください。お願いします。 SELECT 担当名 FROM A_TABLE,TANTO_TABLE WHERE A_TABLE.担当コード1 = TANTO_TABLE.担当コード