Microsoft Access 掲示板

サブクエリの記載方法

7 コメント
views
4 フォロー

https://zawazawa.jp/ms-access/topic/785

以前、このレスでお世話になりました。

サブクエリについての書き方です。

自前で、適当なデータがなく、競馬のデータで、サンプルを作成しました。

クエリ1

SELECT 
 Left([レースID馬],16) AS レースID
 ,T2.単勝人気
 ,T2.数値合計
 ,T2.順位
 ,T2.単勝オッズ
 ,Val(Right([レースID馬],2)) AS ゼッケン
FROM MT_指数追加 AS T1
WHERE T2.順位=5
ORDER BY T2.単勝人気, T2.順位;
クエリ2

SELECT 
 Left([レースID馬],16) AS レースID
 ,T1.単勝人気	
 ,T1.数値合計
 ,T1.順位
 ,T1.単勝オッズ
 ,Val(Right([レースID馬],2)) AS ゼッケン
FROM MT_指数追加 AS T1
WHERE T1.順位=2
ORDER BY T1.単勝人気, T1.順位;

クエリ1 クエリ2を

Left([T1].[レースID馬],16)でINNER JOINしたいのです。

SELECT 
Left([T1].[レースID馬],16) AS レースID
,0 AS 返還フラグ
,4 AS 券種
,Val(Right([T1].[レースID馬],2)) AS 軸2
,Val(Right([T2].[レースID馬],2)) AS ヒモ
,0 AS 空白
,100 AS 購入金額
,Null AS 空白2
,"A" AS 自信
FROM MT_指数追加 AS T1
INNER JOIN
          (SELECT
            FROM MT_指数追加  
            T2.順位
            )
           ON AS T2
          Left([T1].[レースID馬],16)=Left([T2].[レースID馬],16)
          AND WHERE T1.順位=2
          AND WHERE T2.順位=5
          ORDER BY T1.単勝人気;

構文エラー
Left([T1].[レースID馬],16)=Left([T2].[レースID馬],16)の
演算子がありません。

SELECT 
Left([T1].[レースID馬],16) AS レースID
,0 AS 返還フラグ
,4 AS 券種
,Val(Right([T1].[レースID馬],2)) AS 軸2
,Val(Right([T2].[レースID馬],2)) AS ヒモ
,0 AS 空白
,100 AS 購入金額
,Null AS 空白2
,"A" AS 自信

FROM
  (
    MT_売上 AS T1
    INNER JOIN
      (
      MT_指数追加 AS T1
        (
         SELECT 
           Left([レースID馬],16) AS レースID
          ,T1.単勝人気	
          ,T1.数値合計
          ,T1.順位
          ,T1.単勝オッズ
          ,Val(Right([レースID馬],2)) AS ゼッケン
         WHERE T1.順位=2
         FROM 
          MT_指数追加
           ( 
           SELECT 
             Left([レースID馬],16) AS レースID
             ,T2.単勝人気
             ,T2.数値合計
             ,T2.順位
             ,T2.単勝オッズ
             ,Val(Right([レースID馬],2)) AS ゼッケン)))) AS T2 
           ON
           Left([T1].[レースID馬],16)=Left([T2].[レースID馬],16)
           AND WHERE T1.順位=2
           AND WHERE T2.順位=5
           ORDER BY T1.単勝人気;

FROMの構文エラーとなります。

題材が、競馬なので、不謹慎かもしれませんが、どこを修正するのかご教示をお願いしいます

えいじ
作成: 2022/07/27 (水) 22:10:18
通報 ...
1
えいじ 2022/07/27 (水) 22:11:56

すいません

クエリ1

SELECT 
 Left([レースID馬],16) AS レースID
 ,T2.単勝人気
 ,T2.数値合計
 ,T2.順位
 ,T2.単勝オッズ
 ,Val(Right([レースID馬],2)) AS ゼッケン
FROM MT_指数追加 AS T2
WHERE T2.順位=5
ORDER BY T2.単勝人気, T2.順位;

FROM MT_指数追加 AS T1 ⇒FROM MT_指数追加 AS T2

です。

2

ばっとみて、SQLが無茶苦茶です。なにをしたいのか分かりません。

いきなりサブクエリを使った一つのSQLを作成するのではなく、
サブクエリ部分のクエリを単独で作成して、そのクエリを使ったSQLを作成します。

それで、希望の結果がでるのが確認出来たら、クエリをサブクエリのSQLに変更するというようにしましょう。

クエリ1 クエリ2を
Left([T1].[レースID馬],16)でINNER JOINしたいのです。

この文章通りのことをしたいのなら、下記のようなSQLになります。

SELECT
 クエリ1.*,
 クエリ2.*
FROM 
 クエリ1 INNER JOIN クエリ2
 ON クエリ1.レースID = クエリ2.レースID;

まず、これでご希望の結果になってますか。

なっているなら、クエリ1、クエリ2の部分をサブクエリSQLに変更するだけです。

SELECT
 クエリ1.*,
 クエリ2.*
FROM 
 (SELECT 
     ・・・・
  FROM ・・・・ 
  WHERE ・・・・ 
 ) As クエリ1 INNER JOIN
 (SELECT 
     ・・・・
  FROM ・・・・ 
  WHERE ・・・・  
 ) AS クエリ2
 ON クエリ1.レースID = クエリ2.レースID;

ただ、いまのスキルレベルなら無理にサブクエリにせずに複数のクエリを組み合わせて作成した方がメンテナンス性もいいように思います。

3

ちなみに、サブクエリを使わなくても、下記のようなSQLで同じ結果になりそう。

SELECT 
 Left(T1.レースID馬,16) AS レースID1
 ,T1.単勝人気	
 ,T1.数値合計
 ,T1.順位
 ,T1.単勝オッズ
 ,Val(Right(T1.レースID馬,2)) AS ゼッケン1,
 ,Left(T2.レースID馬,16) AS レースI2
 ,T2.単勝人気
 ,T2.数値合計
 ,T2.順位
 ,T2.単勝オッズ
 ,Val(Right(T2.レースID馬],2)) AS ゼッケン2
FROM
 MT_指数追加 AS T1 INNER JOIN MT_指数追加 AS T2
 ON  Left(T1.レースID馬,16) = Left(T2.レースID馬,16)
WHERE T1.順位=2 And  T2.順位=5
ORDER BY T1.単勝人気, T1.順位, T2.単勝人気, T2.順位;
4
えいじ 2022/07/28 (木) 21:22:01

hatena様

重ねての解答ありがとうございます。

やりたいことは下記のことです。

昨日は、

Q_指数買い目順位2⇒クエリ1
Q_指数買い目順位5⇒クエリ2

SELECT 
 T1.[レースID]
,0 AS 返還フラグ
,4 AS 券種
,T1.[ゼッケン] AS 軸2
,T2.[ゼッケン] AS ヒモ5
,0 AS 空白
,100 AS 購入金額
,Null AS 空白2
,"A" AS 自信
 FROM (
         Q_指数買い目順位2 AS T1 INNER JOIN Q_指数買い目順位5 AS T2
         ON T1.[レースID] = T2.[レースID]
       )
ORDER BY T1.[レースID];

SELECT
 クエリ1.,
 クエリ2.

FROM

(SELECT
     Left([レースID馬],16) AS レースID
     ,0 AS 返還フラグ
     ,4 AS 券種
     ,Val(Right([T1].[レースID馬],2)) AS 軸2
     ,0 AS 空白
     ,100 AS 購入金額
     ,Null AS 空白2
     ,"A" AS 自信
  FROM MT_指数追加 AS T1
   WHERE T1.順位=2
 ) As クエリ1 INNER JOIN
 (SELECT
     Left([レースID馬],16) AS レースID
     ,Val(Right([レースID馬],2)) AS ヒモ
  FROM MT_指数追加 AS T2
  WHERE T2.順位=5
 ) AS クエリ2
 ON クエリ1.レースID = クエリ2.レースID;


問題なく作動します
ありがとうございます。


SELECT
 T1.[レースID]
,0 AS 返還フラグ
,4 AS 券種
,Val(Right([T1].[レースID馬],2)) AS 軸2
,Val(Right([T2].[レースID馬],2)) AS ヒモ
,0 AS 空白
,100 AS 購入金額
,Null AS 空白2
,"A" AS 自信
FROM
 (SELECT
  FROM MT_指数追加 AS T1
   WHERE T1.順位=2
 ) As AS T1 INNER JOIN
 (SELECT

  FROM MT_指数追加 AS T2
  WHERE T2.順位=5
 ) AS AS T2
 ON Left([T1].レースID馬,16) = Left([T2].レースID馬,16)

このSQLを実行すると、FROM句の構文エラーとなります。
画像1

昨日はご不快な質問をして、申し訳ありませんでした。

今回記載したコードも全くとんちんかんな、コードでしょうか?
お手すきのときに回答いただけたら幸いです。

5
えいじ 2022/07/28 (木) 21:23:15

すいません、最初のクエリを、分けるつもりが、くっついてしましました。
見にくくて申し訳ありません。

6

下記でうまくいきませんかね。

SELECT 
     Left(T1.レースID馬,16) AS レースID1
     ,0 AS 返還フラグ
     ,4 AS 券種
     ,Val(Right(T1.レースID馬,2)) AS 軸2
     ,0 AS 空白
     ,100 AS 購入金額
     ,Null AS 空白2
     ,"A" AS 自信
     ,Left(T2.レースID馬,16) AS レースID2
     ,Val(T2.レースID馬,2)) AS ヒモ
FROM
 MT_指数追加 AS T1 INNER JOIN MT_指数追加 AS T2
 ON Left(T1.レースID馬,16) = Left(T2.レースID馬,16)
WHERE T1.順位=2 AND T2.順位=5;
7
えいじ 2022/08/02 (火) 08:43:42

hatena様

こんな質問にご丁寧に回答ありがとうございました。