1

与えられた

CREATE TABLE Foo(v1 integer, v2 integer);

INSERT INTO Foo VALUES (1,2);
INSERT INTO Foo VALUES (3,4);
INSERT INTO Foo VALUES (5,6);

SELECT COUNT(*) FROM Foo WHERE mod(rownum,2) = 0;

0行を返し、1を返す必要があります

SELECT COUNT(*) FROM (SELECT mod(rownum,2) z FROM Foo) tt WHERE z=0;

1行を返します

ここで何が欠けていますか?ROWNUMまたはMODのドキュメントには、アイデアを示唆するものは何もありません。

4

2 に答える 2

9

ROWNUMWHEREクエリを実行するまで割り当てられないため、そのような句で使用することはできません。

次のことができます。

SELECT COUNT(*) 
FROM
(
  select v1, v2, rownum rn
  from Foo 
) f
WHERE mod(rn,2) = 0;

これROWNUMは、結果セット内の行の位置であり、レコードが選択された後に評価されます。

これらのタイプのクエリは機能しません。

WHERE ROWNUM > x
WHERE ROWNUM BETWEEN x AND y

しかし、これは機能します

WHERE ROWNUM < x

関数を使用してを評価したいので、その時点ではが使用できないためrownummod機能しません。これが、関数rownumを使用するためにサブクエリに配置する必要がある理由です。mod

于 2012-08-22T19:24:30.697 に答える
2

ROWNUMは、クエリの基になるテーブルではなく、実際のクエリの行番号を返します。したがってSELECT COUNT(*) ...、行番号1の1行を返しますmod(rownum,2) != 0。これは、WHERE計算によって破棄され、実質的に行をまったく返しません。

行番号を列として返す(フィルタリングされていない)副選択が役立つ場合があります。次に、WHERE句が外部選択に適用されます。

于 2012-08-22T19:24:32.110 に答える