ネストされた SQL クエリがあります。
SELECT *
FROM
(
SELECT *
FROM asset_status
ORDER BY session_id DESC
) tmp
GROUP BY asset_id, workflow_element_id
このクエリからビューを作成したいのですが、MySQL はビューでのサブクエリを許可していないようです。これを結合に変換するにはどうすればよいですか?
ネストされた SQL クエリがあります。
SELECT *
FROM
(
SELECT *
FROM asset_status
ORDER BY session_id DESC
) tmp
GROUP BY asset_id, workflow_element_id
このクエリからビューを作成したいのですが、MySQL はビューでのサブクエリを許可していないようです。これを結合に変換するにはどうすればよいですか?
SQL Server では、ビューでサブクエリを使用できます。できないことはSELECT *
、GROUP BY a, b
試してみましたか... (これはクエリ全体ではないと想定するため、可能な限り最小限の変更を行います)
SELECT asset_id, workflow_element_id
FROM
(
SELECT *
FROM asset_status
-- ORDER BY session_id DESC (Removed as innefective in a view)
) tmp
GROUP BY asset_id, workflow_element_id
また、内側のクエリの ORDER BY は無効であることに注意してください (おそらく許可されないことさえあります)。これは、外側のクエリが並べ替えを許可されているためです (常に別の順序で返されるとは限りませんが、このレイアウトはあなたが望むように見える順序を保証しません)。外側のクエリでも、ビューを使用すると結果が順序付けられる場合がありますが、オプティマイザーは結果を並べ替えることができます。ビューを使用したクエリに ORDER BY がない限り、順序が完全に保証されることはありません...
SELECT * FROM view ORDER BY x
最後に、これを LEFT JOIN の質問としてタグ付けしました。コードのより完全な例があれば、誰かが別のレイアウトを提案すると確信しています。しかし、私は今数日間外出しています。幸運を!:)
内部の order by の使用が保証されていないため、サブクエリは必要ありません。あなたは書ける:
SELECT DISTINCT asset_id, workflow_element_id
FROM asset_status
たとえば、注文する必要がある場合session_id
は、集計に含める必要がありますmax
。(またはグループ内)
SELECT asset_id, workflow_element_id
FROM asset_status
GROUP BY asset_id, workflow_element_id
ORDER BY MAX(session_id) DESC
MySQL リファレンス マニュアルによると、サブクエリを使用するビューを作成できますが、From 句では作成できません。
したがって、次のようなビューを作成する必要があると思います。
select a.*
from asset_status a
join (select asset_id, workflow_element_id, MAX(session_id) session_id
from asset_status
group by asset_id, workflow_element_id) sq
on a.session_id = sq.session_id
ただし、おそらく元のクエリほどには機能しません。