web-dev-qa-db-ja.com

Oracle:「= ANY()」と「IN()」

私が興味を持っているのは、Oracle SQLの何か(他にあるかどうかはわかりません)につまずいただけです。グーグルで記号を検索するのは難しいので、私はここでwikiとして尋ねています...

私はちょうどあなたができる値のセットに対して値をチェックするとき

WHERE x = ANY (a, b, c)

通常とは対照的に

WHERE x IN (a, b, c)

だから、私は興味があります、これらの2つの構文の理由は何ですか? 1つは標準で、もう1つは奇妙なOracle構文ですか?それとも両方とも標準ですか?そして、パフォーマンス上の理由から、一方が他方よりも優先されますか?

その「= ANY」構文について誰も私に何を伝えることができるのか興味があります。 CheerZ!

50
eidylon

ANY(またはその同義語SOME)は、単純な相関を持つEXISTSの構文シュガーです。

SELECT  *
FROM    mytable
WHERE   x <= ANY
        (
        SELECT  y
        FROM    othertable
        )

以下と同じです:

SELECT  *
FROM    mytable m
WHERE   EXISTS
        (
        SELECT  NULL
        FROM    othertable o
        WHERE   m.x <= o.y
        )

ヌル不可フィールドの等値条件では、INに似たものになります。

SQL ServerMySQL、およびPostgreSQLを含むすべての主要なデータベースは、このキーワードをサポートしています。

33
Quassnoi
IN- Equal to any member in the list
ANY- Compare value to **each** value returned by the subquery
ALL- Compare value to **EVERY** value returned by the subquery

<ANY() - less than maximum
>ANY() - more than minimum
=ANY() - equivalent to IN
>ALL() - more than the maximum
<ALL() - less than the minimum

例えば:

各部門の最低給与と同じ給与を獲得している従業員を見つけます:

SELECT last_name, salary,department_id
FROM employees
WHERE salary IN (SELECT MIN(salary)
                 FROM employees
                 GROUP BY department_id);

ITプログラマーではなく、給与がどのITプログラマーよりも低い従業員:

SELECT employee_id, last_name, salary, job_id
FROM employees
WHERE salary <ANY
                (SELECT salary
                 FROM employees
                 WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';

給与がIT_PROGのジョブIDを持ち、IT_PROGではないすべての従業員の給与よりも低い従業員:

SELECT employee_id,last_name, salary,job_id
FROM employees
WHERE salary <ALL
                (SELECT salary
                 FROM employees
                 WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';

....................

それが役に立てば幸い。 -ノーリン・ファティマ

19
noorin fatima

簡単に言えば、O'Reillyの「Mastering Oracle SQL」から引用するには:

「サブクエリでINを使用することは、ANYを使用することと機能的に同等であり、サブクエリによって返されるセットで一致が見つかった場合にTRUEを返します。」

「INはANYよりも直感的であることに同意すると思います。そのため、INはほとんどの場合このような状況で使用されます。」

ANY対INについての質問が解決することを願っています。

16
CraigH

Ibelieveあなたが探しているのはこれです:

http://download-west.Oracle.com/docs/cd/B10501_01/server.920/a96533/opt_ops.htm#1005298 (リンクは Eddie Awad's Blog にあります)ここでまとめると:

last_name IN ('SMITH', 'KING', 'JONES')

に変換されます

_last_name = 'SMITH' OR last_name = 'KING' OR last_name = 'JONES'_

ながら

salary > ANY (:first_sal, :second_sal)

に変換されます

_salary > :first_sal OR salary > :second_sal_

オプティマイザーは、ANYまたはSOME演算子とそれに続くサブクエリを使用する条件を、EXISTS演算子と相関サブクエリを含む条件に変換します

9
Sean Vieira

ANY構文を使用すると、次のように記述できます。

WHERE x > ANY(a, b, c)

またはイベント

WHERE x > ANY(SELECT ... FROM ...)

地球上に実際にANY(およびその兄弟ALL)を使用している人がいるかどうかはわかりません。

6
erikkallen

クイックグーグルはこれを見つけました http://theopensourcery.com/sqlanysomeall.htm

Anyは、=以外の演算子を使用することを許可し、他のほとんどの点(nullの特別な場合)ではINのように動作します。 =演算子を使用して、INをANYとして考えることができます。

5
Hogan

これは標準です。 SQL 1992 標準状態

8.4 <述語内>

[...]

<in predicate> ::=
    <row value constructor>
      [ NOT ] IN <in predicate value>

[...]

2)RVCを<row value constructor>とし、IPVを<in predicate value>とします。

[...]

4)式

  RVC IN IPV

に等しい

  RVC = ANY IPV  

したがって、実際、<in predicate>動作定義は8.7 <quantified comparison predicate>に基づいています。つまり、OracleはここでSQL標準を正しく実装しています。

1
Lukas Eder

リンクされた記事の1つがこれを指摘しているかもしれませんが、一致(=)を探すときに2つが同じものを返すというのは本当ではありません。ただし、一連の回答(>、<など)を探す場合、「IN」を使用することはできず、「ANY」を使用する必要があります...

私は初心者です、明白な何かを見逃してしまった場合は許してください...

1
Dave

MySqlは、ドキュメント内のすべてを明確にクリアします。

比較演算子に従う必要があるANYキーワードは、「サブクエリが返す列の値のいずれかに対して比較がTRUEの場合にTRUEを返す」ことを意味します。次に例を示します。

SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);

テーブルt1に(10)を含む行があるとします。 t2には10より小さい値7があるため、テーブルt2に(21,14,7)が含まれる場合、式はTRUEです。テーブルt2に(20,10)が含まれる場合、またはテーブルt2が空の場合、式はFALSEです。テーブルt2に(NULL、NULL、NULL)が含まれている場合、式は不明(つまりNULL)です。

https://dev.mysql.com/doc/refman/5.5/en/any-in-some-subqueries.html

また、Alan BeaulieuによるLearning SQLは次のように述べています。

ほとんどの人はINの使用を好みますが、= ANYを使用することはIN演算子を使用することと同等です。

1
Robert Rocha