3

ネストされた SQL クエリがあります。

SELECT * 
FROM
(
    SELECT *
    FROM asset_status
    ORDER BY session_id DESC
) tmp
GROUP BY asset_id, workflow_element_id

このクエリからビューを作成したいのですが、MySQL はビューでのサブクエリを許可していないようです。これを結合に変換するにはどうすればよいですか?

4

3 に答える 3

2

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 の質問としてタグ付けしました。コードのより完全な例があれば、誰かが別のレイアウトを提案すると確信しています。しかし、私は今数日間外出しています。幸運を!:)

于 2012-02-13T16:56:35.127 に答える
0

内部の 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
于 2012-02-13T16:57:19.167 に答える
0

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

ただし、おそらく元のクエリほどには機能しません。

于 2012-02-13T17:50:51.813 に答える