0

正式な名前がわからないので、オンラインで何も見つけられないのはそのせいかもしれません。基本的に、vfp で sql を使用すると、レコード カーソルを移動したり、結果を保存したりせずに、最初のパス スルー (場合によっては 2 回?) が実行されます。残念ながら、SQL には、最初のパス中に実行して変更するサブルーチンがあります。

SQL クエリでサブルーチンを使用するのはなぜですか? vfp は、select アイテム内のサブクエリの外部参照をサポートしていないためです (繰り返しになりますが、正式名称はわかりません)。

例:select id, (select detail.name from detail where master.id == detail.id) name from master

ただし、これは機能します。select id, getname(id) from master

wheregetname()は、最初の例の sql を含むサブルーチンです。

結合を使用することもできますが、上記は単なる例であり、私の場合、結合は機能しません。

初期パススルーに対処する方法はありますか? vfp はブール値のようなものを作成しますfirstpassか? サブルーチンにカウントを追加できると思いますが、それは以前よりも厄介なようです。

あるいは、誰かが説明したり、vfp の初期パスの説明を私にリンクしたりできますか? 以前は最初のパスを 1 回しか実行していなかったと思いますが、コードを変更した後は 2 回実行しています。

編集:わかりました、私は間違っていました。上記の例は機能します。うまくいかないのは次のとおり
SELECT d2.id, (SELECT TOP 1 d1.lname l FROM dpadd d1 WHERE d1.id== d2.id ORDER BY l) FROM dpadd d2
です。「SQL: このタイプのクエリはサポートされていません」というエラーが表示されます。
奇妙なことに、次のようにするとうまくいきます:
SELECT d2.id, (SELECT COUNT(d1.lname) FROM dpadd d1 WHERE d1.id == d2.id) FROM dpadd d2

サブルーチンについては、私の形のメソッドです。データベースはローカルの .dbf ファイルです。私はサーバーとやり取りしていませんinto cursor。節を指定して直接SQLコマンドを実行し、レポートを生成するだけです(通常)。

「サポートされていない」実際に役立つ選択ステートメントを数分後に投稿します。top 1この例がまったく役に立たないことに気付いたと思います。

4

1 に答える 1

0

TOP はプロジェクションでは許可されていないようです。その例では、代わりにこれを行うことができます。

SELECT d2.id, (SELECT MAX(d1.lname) l FROM dpadd d1 WHERE d1.id== d2.id) FROM dpadd d2

他に何が問題になっていますか?

タマル

于 2012-03-28T20:48:06.773 に答える