hatena
hatena
2025/02/17 (月) 17:21:58
質問の結構複雑なSQLを読み解くのは骨なので、
私が複数クエリをサブクエリを使って一つにまとめる場合の手法を紹介しておきます。
まず、クエリデザインビューから作成したSQLは不必要な()が多くなり読みづらいので、不要なカッコは除去します。
その後、階層関係が分かりやすいように適切なインデントを付けて読みやすくします。
インデントの付け方は人それぞれの好みがあるので工夫して自分が読みやすいようにしてください。
例えば質問の最初のSQLなら、自分なら下記のようにします。
SELECT
M_棟.物件ID, M_棟.棟名, Q_F.[フロア数], Q_R.部屋数
FROM
(M_棟 INNER JOIN Q_F
ON M_棟.棟ID = Q_F.棟ID AND M_棟.物件ID = Q_F.物件ID)
INNER JOIN Q_R
ON M_棟.棟ID = Q_R.棟ID AND M_棟.物件ID = Q_R.物件ID
WHERE M_棟.物件ID="00165";
つぎにサブクエリにしたいクエリ名(Q_F, Q_R)の前に下記のように () AS を挿入します。
SELECT
M_棟.物件ID, M_棟.棟名, Q_F.[フロア数], Q_R.部屋数
FROM
(M_棟 INNER JOIN () AS Q_F
ON M_棟.棟ID = Q_F.棟ID AND M_棟.物件ID = Q_F.物件ID)
INNER JOIN () AS Q_R
ON M_棟.棟ID = Q_R.棟ID AND M_棟.物件ID = Q_R.物件ID
WHERE M_棟.物件ID="00165";
この挿入したカッコの中に、それぞれのクエリのSQLを挿入します。
もちろん挿入する前にそれぞれのSQLも読みやすいようにインデントを入れておきます。
すると下記のような感じになります。
SELECT
M_棟.物件ID, M_棟.棟名, Q_F.[フロア数], Q_R.部屋数
FROM
(M_棟 INNER JOIN
(
SELECT
M_棟.物件ID, M_棟.棟ID, M_棟.棟名, Count(M_フロア.[フロアID]) AS フロア数
FROM
M_棟 INNER JOIN M_フロア
ON M_棟.棟ID = M_フロア.棟ID AND M_棟.物件ID = M_フロア.物件ID
GROUP BY M_棟.物件ID, M_棟.棟ID, M_棟.棟名
) AS Q_F
ON M_棟.棟ID = Q_F.棟ID AND M_棟.物件ID = Q_F.物件ID
)
INNER JOIN
(
SELECT
M_部屋.物件ID, M_フロア.棟ID, M_棟.棟名, M_部屋.[フロアID], Count(M_部屋.部屋ID) AS 部屋数
FROM
(M_棟 INNER JOIN M_フロア
ON M_棟.物件ID = M_フロア.物件ID AND M_棟.棟ID = M_フロア.棟ID)
INNER JOIN M_部屋
ON M_フロア.物件ID = M_部屋.物件ID AND M_フロア.棟ID = M_部屋.棟ID AND M_フロア.[フロアID] = M_部屋.[フロアID]
GROUP BY M_部屋.物件ID, M_フロア.棟ID, M_棟.棟名, M_部屋.[フロアID]
) AS Q_R
ON M_棟.棟ID = Q_R.棟ID AND M_棟.物件ID = Q_R.物件ID
WHERE M_棟.物件ID)="00165";
提示のSQLを機械的につなげただけのものなので、希望の結果になるかどうかはそちらでしっかり確認してください。
通報 ...