0

問題が発生したか、MySQLの制限が発生した可能性があります。

状況は次のとおりです。

私はSPXを持っており、1つまたは2つの引数に基づいて関連するレコードを選択しています。SPは、0、1、またはそれ以上のIDのリストを返します。そのリストを次のようなIN句で使用したいと思います。

SELECT
    *
FROM
    table
WHERE
    id IN (spX(y));

これは私にエラーを与えます:

Syntax error or access violation: 1305 FUNCTION z.spX does not exist

エラーは少しあいまいです。アクセス違反やSP自体の存在ではなく、構文エラーであると確信しています。SPに直接電話をかけると、期待どおりの結果が得られます。

これはちょっと行き止まりのように感じます。私の予想では、SPが1行以上を返した場合ではなく、 1以上を返した場合にMySQLがエラーをスローします(この場合、代わりにFUNCTIONを使用でき、これはすぐに機能します)。

したがって、問題は、SPの結果をIN句で使用する方法はありますか?

補足:SPを使用する代わりに、テーブルを結合し、既存のクエリに新しいwhere句を追加するだけで、同じ結果が得られることを認識しています。ただし、ここでの本当の問題は、新しい機能をアプリケーションに追加する必要があり、大量のクエリに参加する必要がないことです。代わりにSPを使用することが、抵抗を最小限に抑える方法です。

4

2 に答える 2

0
 SELECT * FROM table WHERE id IN(SELECT spX FROM table WHERE y = ???);

括弧内にselectステートメントが必要です。そうでない場合、何をしているのかが非常に不明確になります。

sPxがテーブルの名前であり、yがテーブルから引き出したい変数である場合、括弧内のselectステートメントでそれを言う必要があります。構文エラーだけを定義する

于 2012-06-22T12:46:30.447 に答える
0

チャットで提案されたソリューションを実装しました。

https://chat.stackoverflow.com/rooms/12910/discussion-between-robin-vg-and-hituptony

私がステップバイステップで行うこと:

  1. 関係するすべてのクエリにプレースホルダーを配置します。
  2. 私のアプリケーションのより高いレベルでは、ストアドプロシージャを呼び出します。明確にするために:SPに関して私が確かに知っている2つのことがあります:
  • パラメータとして常に1つのIDを取ります。
  • それは常に0以上のIDを返します。
  1. SPの結果に応じてIN()句を生成します。
  2. プレースホルダーを生成されたIN()句に置き換えて、クエリを実行します。

このようにして、アプリケーションロジック/クエリを変更することなく、SP自体の条件をいつでも追加または変更できます。

于 2012-06-25T09:56:17.027 に答える