質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.10%

Access SQL:サブクエリでselectした結果を使いたい

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,495

salty_

score 14

前提

それぞれのテーブルにはこのようなデータが入っています。
◎◎:予約者情報
△△:店舗マスタ
■■:◎◎と△△を照合させて、一致した結果が入っているテーブル

作ったもの

2つ動くそれぞれで正しい結果が得られるクエリがあります。(テーブル名は伏字にしています)

①◎◎と△△を照合させて、不一致だったデータを取得するクエリ。

SELECT ◎◎
FROM ◎◎ LEFT JOIN △△ ON ([△△].[店舗名] = [◎◎].[店舗名])
WHERE [△△].[店舗名] = [◎◎].[店舗名] IS NULL;

②■■テーブルから月別に必要な情報を取得するクエリ

SELECT YEAR([■■].[日時]) AS 年, MONTH([■■].[日時]) AS 月, Count(
[■■].受付日時
) AS 総数, Count(
[■■].予約 = '●' 
Or Null
) AS 予約, Count(
[■■].実施 = '●' 
Or Null
) AS 実施, Count(
[■■].結果 = 'OK' 
Or Null
) AS OK人数 INTO 新しいテーブル
FROM ■■
GROUP BY YEAR([■■].[日時]), MONTH([■■].[日時]);

求めたい結果

①◎◎と△△を照合させて、不一致だったデータを取得するクエリ。】の実行結果から
②■■テーブルから月別に必要な情報を取得するクエリ】を実行したいです。
=不一致の結果も月別に集計したいです。
(サブクエリと呼ぶのでしょうか。selectした結果をselectしたいです。)

作ったクエリ

SELECT YEAR([■■].[日時]) AS 年, MONTH([■■].[日時]) AS 月, Count(
[■■].受付日時
) AS 総数, Count(
[■■].予約 = '●' 
Or Null
) AS 予約, Count(
[■■].実施 = '●' 
Or Null
) AS 実施, Count(
[■■].結果 = 'OK' 
Or Null
) AS OK人数 INTO 新しいテーブル
FROM (
SELECT ◎◎
FROM ◎◎ LEFT JOIN △△ ON ([△△].[店舗名] = [◎◎].[店舗名])
WHERE [△△].[店舗名] = [◎◎].[店舗名] IS NULL;
)
GROUP BY YEAR([■■].[日時]), MONTH([■■].[日時]);

調べてみてFROM句の中に、①のselect文を入れてみたのですが
FROM句の構文エラーになります。。。

初歩的な質問で申し訳ありませんが、どなかたお知恵をお貸しください。
よろしくお願いします。

実行環境

Acceess 2016です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Orlofsky

    2019/07/27 10:29

    NULL の判断は カラム名 IS NULL とか カラム名 IS NOT NULL って記述します。
    伏せ字じゃなくて、ちゃんと実行できるレベルのSQLを提示しないと回答してくれる奇特な人は少なそう。

    キャンセル

  • salty_

    2019/07/27 11:46

    ご指摘ありがとうございます。例にするテーブルを記述する時間がなかったので、とりあえずこの形式で質問しましたが、そうなんですね…
    とりあえず、①の結果を別のテーブルにinsertしてから②の実行をするようにします。

    キャンセル

  • Orlofsky

    2019/07/27 12:23

    NULLの指摘も無理に直せとは言わないけど、誰もコメントしてくれなくても恨まないでね。
    コードは https://teratail.com/help/question-tips#questionTips3-7 の [コード] に修正した方がコメントが付きやすいかも?

    キャンセル

  • gentaro

    2019/07/27 12:40

    伏せ字にするならするで(回答が付きやすいかどうかは別として)良いんですけど、最初の
    > SELECT ◎◎
    > FROM ◎◎
    の時点でおかしい気が。

    「SELECT ◎◎.*」のつもりかもしれないけど、「◎◎」テーブルにどんな項目があるのかの説明がされていないので、せめてテーブル定義ぐらいは資料として載せましょう。

    キャンセル

回答 4

check解決した方法

0

私のレベルが低いですので、そのまま①の実行結果を別テーブルにinsertして、②を実行して結果を取得します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

まずは、【①◎◎と△△を照合させて、不一致だったデータを取得するクエリ。】 をサブクエリで、いきなり書かずに、別のクエリとして保存。そのうえで、【②■■テーブルから月別に必要な情報を取得するクエリ】 のテーブル部分に、①のクエリ名を入れて、普通に動作するのでしょうか。
もし、動作するので、あれば、まとめて、サブクエリとして、記述する際の指定の仕方が、まずいのかもしれませんね。
たしか、Accessでfrom句にサブクエリを入れる場合は、「SELECT ~ FROM (サブクエリ) AS tmp」のように、別名定義をするのだったと思うのですが、そのような記述で指定してみると、正しく動作するでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/15 02:18

    回答は編集できます。複数回答を投稿するのではなく追記してまとめてください。

    キャンセル

0

あと、FROM句に、サブクエリを記述する時に、最後のこところに「;」が付きっぱなしなので、これも、取り除いておいた方が良いと思います。(←これが原因?)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

よく見てみたら、①のクエリは、本当に、単体で正しく、動作するのでしょうか。
左外部結合を利用した不一致クエリみたいですが、◎◎を左側だとして、普通であれば、WHERE句は、
「WHERE [△△].[店舗名] = [◎◎].[店舗名] IS NULL」
ではなく、
「WHERE [△△].[店舗名] IS NULL」
だと思うのですが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる