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

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

新規登録して質問してみよう
ただいま回答率
85.53%
GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

24541閲覧

SQLのサブクエリを使用した結合で

taka1027

総合スコア7

GROUP BY

GROUP BYとはSQL文のひとつで、SELECT文において特定の列の値が等しい行ごとに表をグループ化します。

JOIN

これはSQL文のJOINに関するタグです。リレーショナルデータベースシステムの二つ以上のテーブルを結合する際に、この構文が利用されます。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/02/08 14:04

編集2016/02/08 14:17

前提・実現したいこと

下記SQLをサブクエリなしで実現したい

ソースコード

Oracle 11g

SELECT
A.ID,
A.TYPE,
SUM(B.AMOUNT_A) AS AMOUNT_A,
SUM(B.AMOUNT_B) AS AMOUNT_B
FROM
(
SELECT
ID,
TYPE,
FROM ID_MASTER
WHERE LOCATION = 'JPN'
AND CATEGORY = 'ABC'
GROUP BY
ID,
TYPE
) A
LEFT OUTER JOIN
(
SELECT
ID,
TYPE,
SUM(AMOUNT_A), AS AMOUNT_A,
SUM(AMOUNT_B), AS AMOUNT_B
FROM TMP_TABLE
WHERE LOCATION = 'JPN'
AND DISP_TYPE = 'ABC'
GROUP BY
ID,
TYPE,
TMP_NAME
) B
ON A.CODE = B.CODE
AND A.TYPE = B.TYPE
ORDER BY
A.ID,
A.TYPE
;

SQLのチューニング中で上記のようなSQLをサブクエリを使わず実現したいのですがハマっております。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xxpodxx

2016/02/08 14:09

1つ目のサブクエリですが、Group byの項目にない項目がSELECT句に集計関数なしであるのですがこれであってるんですか?
taka1027

2016/02/08 14:14

すいません、項目名が変だったので修正しました。
guest

回答2

0

ベストアンサー

こんな感じで、先にLEFT OUTER JOINしてやるのはどうでしょうか?
TMP_TABLEとID_MASTERの関係がn:1ならこれで大丈夫だと思います。
n:nなら結合でレコードが増えちゃうので、ID_MASTERをGroup Byで集約してn:1の関係にして下記のようにするしかないかなと思います…。

SELECT A.ID,
A.TYPE,
SUM(A.AMOUNT_A) AS AMOUNT_A,
SUM(A.AMOUNT_B) AS AMOUNT_B
FROM TMP_TABLE AS A
LEFT OUTER JOIN ID_MASTER AS B
ON A.ID = B.ID
AND A.TYPE = B.TYPE
AND B.LOCATION = 'JPN'
AND B.CATEGORY = 'ABC'
WHERE A.LOCATION = 'JPN'
AND A.DISP_TYPE = 'ABC'
GROUP BY
A.CODE,
A.TYPE,
A.TMP_NAME
ORDER BY
A.ID,
A.TYPE

投稿2016/02/08 14:26

xxpodxx

総合スコア33

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taka1027

2016/02/09 03:27

ご回答ありがとうございました、無事うまくいきました!
guest

0

データベースの制約などの状況が分からないので、回答は難しいです。
サブクエリ「A」でID,TYPEをグループしていますが、ID_MASTERのID,TYPEの項目はユニーク制約されていないということなのでしょうか?(テーブル名称から考えると普通はされていると思います)
もしそうであればサブクエリを使わない方法は難しいのではないかと思います。

逆に制約が設定されているなら、サブクエリ「A」は不要ですので「TMP_TABLE」と「ID_MASTER」を普通にJOINしてGROUPを行えばよろしいかと。

投稿2016/02/08 14:52

hirohiro

総合スコア2068

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問