1

特定の構成に添付された項目のリストを取得するストアド プロシージャがあります (各項目は 1 つの構成に添付されています。そうでない場合 (つまり、フィールドがNULL)、デフォルト構成に添付されていると見なされます (そのフィールドISDEFAULT1) . ページネーションを使用してアイテムを取得したい.ROWNUMフィールドが1から始まることを思い出したので、私は書いた.

SELECT *
FROM 
  ITEMS item
WHERE
  (ROWNUM - 1) >= 0 and
  (ROWNUM - 1) < (0 + 10) and
  (item.CONFIGID = 0 or 
  item.CONFIGID is null and exists (SELECT config.CONFIGID FROM CONFIGURATION config WHERE config.CONFIGID = 0 and config.ISDEFAULT = 1));

このリクエストで返された結果はゼロでした。

私はそれを次のように変更しました:

SELECT item.NAME,
item.ITEMID,
item.CONFIGID,
ROWNUM
FROM 
  ITEMS item
WHERE
      (ROWNUM - 1) >= 0 and
      (ROWNUM - 1) < (0 + 10) and
  (item.CONFIGID = 0 or 
  item.CONFIGID is null and exists (SELECT config.CONFIGID FROM CONFIGURATION config WHERE config.CONFIGID = 0 and config.ISDEFAULT = 1));

そしてそれは働いた!ステートメントにを追加するROWNUMと、SELECT問題が修正されました。

それから私は試しました:

SELECT *
FROM 
  ITEMS item
WHERE
  ROWNUM >= (0 + 1) and
  ROWNUM < (0 + 1 + 10) and
  (item.CONFIGID = 0 or 
  item.CONFIGID is null and exists (SELECT config.CONFIGID FROM CONFIGURATION config WHERE config.CONFIGID = 0 and config.ISDEFAULT = 1));

SELECT *私はステートメントを書き戻し、を- 1比較演算子の反対側に移動しました (したがって、それらは になりました+ 1)。これも同様に機能します。

私の最初のクエリが機能せず、結果がゼロになるのに対し、他の2つは魅力的に機能する理由を誰かが説明できますか?

4

1 に答える 1

0

ROWNUM に問題はないと思います。実行してみてください:

SELECT *
  FROM ITEMS item
 WHERE
  (ROWNUM - 1) >= 0 and
  (ROWNUM - 1) < (0 + 10);


SELECT item.NAME,
       item.ITEMID,
       item.CONFIGID,
       ROWNUM
  FROM ITEMS item
 WHERE
  (ROWNUM - 1) >= 0 and
  (ROWNUM - 1) < (0 + 10);

どちらも正常に動作するはずです。これは、フィルターの 2 番目の部分に問題があることを意味します。次のサブクエリ

(SELECT config.CONFIGID FROM CONFIGURATION config WHERE config.CONFIGID = 0 and config.ISDEFAULT = 1));

無相関です。したがって、どのレコードに対しても常に同じ結果が返されます。item.CONFIGID ごとに条件に括弧を追加する必要があると思います。

(item.CONFIGID = 0) or 
(
item.CONFIGID is null and
exists (SELECT ...)
)

また

(item.CONFIGID = 0 or     
item.CONFIGID is null) and
exists (SELECT ...)

それがあなたの問題だと思います。しかし、データを見ないとわかりません。

于 2013-12-13T15:16:18.547 に答える