0

次の Fiddle で 102 が返されないのはなぜですか? 両方の列に存在しない最小の数を探しています。

注意: 1 つの列は数値で、もう 1 つは varchar です。

SELECT NVL(MIN(a1.id_int)+1, 111)
  FROM bPEOPLE a1
 WHERE NOT EXISTS (SELECT 1
                     FROM PEOPLE a2
                    WHERE a2.id_int=a1.id_int+1
                   )
   AND NOT EXISTS ( SELECT 1
                      FROM PEOPLE a3
                     WHERE TO_NUMBER(a3.id_str)=a1.id_int+1
                   )
   AND a1.id_int + 1 > 100
   AND a1.id_int + 1 < 110;

SQLフィドル

4

4 に答える 4

1

id_int列から始めて を追加するため、102 は得られません1id_int102 を獲得するチャンスを得るには、列に101 を配置する必要があります。

言い換えれば、あなたのエラーは、あなたが始めてMIN(a1.id_int)無視することですMIN(TO_NUMBER(a3.id_str))

これはおそらくあなたが望むものです

SELECT NVL(MIN(n)+1, 111) FROM
(
  SELECT id_int as n FROM PEOPLE
  UNION
  SELECT TO_NUMBER(id_str) as n FROM PEOPLE
) p
WHERE
  NOT EXISTS
  (
    SELECT
      1
    FROM
      PEOPLE a2
    WHERE
      a2.id_int=n+1
  )
  AND
  NOT EXISTS
    (
      SELECT
        1
      FROM
        PEOPLE a3
      WHERE
        TO_NUMBER(a3.id_str)=n+1
    )
AND n + 1 > 100
AND n + 1 < 110;
于 2013-08-22T12:15:34.377 に答える
0

あなたのnot exists句は、「現在の行よりも1大きい値を持つ別の行がある行を除外する」と言っています。これが当てはまる唯一の行は最後の行ですが、質問は最初の行が必要であることを意味します。

+1これを修正するには、not exists節内の を述語内の他の列に移動するだけです。

また、フィドルでは、105 を保持する整数値をインクリメントしています。101 をインクリメントする場合はid_str、関数で列を選択する必要があります。

SELECT
  NVL(MIN(a1.id_str)+1, 111)
FROM
  PEOPLE a1
WHERE
  NOT EXISTS
  (
    SELECT
      1
    FROM
      PEOPLE a2
    WHERE
      a2.id_int+1=a1.id_int
  )
  AND
  NOT EXISTS
    (
      SELECT
        1
      FROM
        PEOPLE a3
      WHERE
        TO_NUMBER(a3.id_str)+1=a1.id_int
    )
AND a1.id_int + 1 > 100
AND a1.id_int + 1 < 110;

最後に、実際に関数を適用する必要がない提供されたデータセットではmin、(101, 105) 行のみが選択されます。ただし、実際のデータセットでは最小値を取る必要がある場合があります。

于 2013-08-25T20:13:32.813 に答える