0

特定の列の最大値を持つ行を選択したい場合は、単純にこれを行うことができます

SELECT * FROM tablename WHERE columnname=(SELECT MAX(columnname) FROM tablename)

私の問題は 2 つあります。まず、この値が列ではなく、行を操作するストアド プロシージャの結果である場合、構文は何ですか? 何かのようなもの

SELECT * FROM tablename
WHERE CALL procname (???)
   = (SELECT MAX (CALL procname (???) FROM tablename)

このクエリを具体化するにはどうすればよいですか?

第 2 に、この単純な形式では、すべての行で 1 回呼び出して決定し、次に各行でもう一度呼び出して、各行に最大値があるかどうかをテストする可能性procnameあります。MAX(...)

これを最適化するにはどうすればよいですか?一時テーブルに何か関係があるのではないかと推測していますが、エンジンがどれほど賢いかはわかりません。維持するだけでよいCスタイルのforループのパフォーマンスと比較しています一度に 1 つの行の値。

4

1 に答える 1

0

数値プライマリがpkcolあり、計算列colnameも数値であると仮定すると、次のようなものを試すことができます

SELECT
  @proc:=CALL procname(colname) AS dummy1,
  IF(@proc>@val,@id:=pkcol,@id) AS dummy2,
  IF(@proc>@val,@val:=@val,@val) AS dummy3
FROM
  (@id:=0) AS initid,
  (@val:=0) AS initval,
  tablename
;

-- discard query result

SELECT * FROM tablename WHERE pkcol=@id;

これは、C コンストラクトに非常に近いものです。

于 2012-02-14T13:03:06.027 に答える