EXISTS 述部
EXISTS 述部は、特定の行の存在を調べるためのものです。 全選択は列をいくつでも指定でき、結果は真または偽になります。
EXISTS 述部の結果:
- 全選択によって指定された行数がゼロでない場合のみ、真。
- 全選択によって指定された行数がゼロの場合のみ、偽。
- 不明になることはありません。
全選択で戻される値は無視されるので、
全選択内の SELECT 文節は列をいくつでも指定することができます。 次の文節を使えば簡単です。
SELECT *NULL、LIKE、および IN の各述部とは異なり、EXISTS 述部には NOT という語を含む
形式はありません。 EXISTS 述部を否定する場合は、次のように論理演算子の NOT を
その前に置いてください。
NOT EXISTS (fullselect)この場合は、EXISTS 述部が真の時に偽の結果となり、述部が 偽の時に真の結果となります。 ここでは、NOT は論理演算子であり、述部の一部ではありません。 論理演算子については、 検索条件で説明しています。
例 1 : 次のクエリは、DSN8C10.EMP に登録されている社員のうち、少なくとも1人の給与が20000未満の部署で働く社員の社員番号をリストアップします。 多くの EXISTS 述部と同様に、この照会の述部も相関変数を含んでいます。
SELECT EMPNO
FROM DSN8C10.EMP X
WHERE EXISTS (SELECT * FROM DSN8C10.EMP
WHERE X.WORKDEPT=WORKDEPT AND SALARY<20000);例 2: 2009 年の第 1 四半期に少なくとも 1 回は電話をかけたことのある、カリフォルニア州の加入者 (SNO) をリストします。 結果を SNO 順に並べます。 各 MONTHnn 表は、SNO、CHARGES、および DATE の列を持ちます。 CUST 表は、SNO と STATE の列を持ちます。
SELECT C.SNO
FROM CUST C
WHERE C.STATE = 'CA'
AND EXISTS (
SELECT *
FROM MONTH1
WHERE DATE BETWEEN '01/01/2009 AND '01/31/2009'
AND C.SNO = SNO
UNION ALL
SELECT *
FROM MONTH2
WHERE DATE BETWEEN '02/01/2009 AND '02/28/2009'
AND C.SNO = SNO
UNION ALL
SELECT *
FROM MONTH3
WHERE DATE BETWEEN '03/01/2009 AND '03/31/2009'
AND C.SNO = SNO
)
ORDER BY C.SNO;