説明
FOR SOME 述語を使用すると、テーブル内の 1 つまたは複数のフィールド値にブーリアン条件テストを実行した結果に基づいて、レコードを返すかどうかを決定できます。fieldcondition が True と評価された場合は、レコードが返されます。fieldcondition が False と評価された場合は、レコードは返されません。
述語条件を指定できる場所であればどこでも、FOR SOME を使用できます。詳細は、このドキュメントの "述語の概要" ページを参照してください。
区切り括弧は、table (およびそのオプションの t-alias) 引数には必須となっています。区切り括弧は、fieldcondition 引数でも必須となります。空白は使用できますが、これら 2 組の括弧の間には必要ではありません。
一般に、FOR SOME は、別テーブル内のレコードの内容に基づいてテーブルからレコードを返すかどうかを決定するために使用されます。FOR SOME は、同一テーブル内のレコードの内容に基づいてテーブルからレコードを返すかどうかを決定するためにも使用できます。この後者の場合は、すべてのレコードが返されるか、レコードは返されないかのどちらかです。
以下の例では、FOR SOME は、Sample.Person テーブルから、その Name フィールド値が Sample.Employee テーブル内の Name フィールド値と一致するすべてのレコードを返します。
SELECT Name,COUNT(Name) AS NameCount
FROM Sample.Person AS p
WHERE FOR SOME (Sample.Employee AS e)(e.Name=p.Name)
ORDER BY Name
以下の例では、FOR SOME は、同一テーブルのブーリアン・テストに基づいて Sample.Person テーブル内のレコードを返します。このプログラムは、65 より大きい Age 値が含まれるレコードが 1 つでもあれば、すべての Sample.Person レコードを返します。それ以外の場合はレコードを返しません。Sample.Person 内の 1 つ以上のレコードの Age フィールドに 65 より大きい値が含まれているため、すべての Sample.Person レコードが返されます。
SELECT Name,Age,COUNT(Name) AS NameCount
FROM Sample.Person
WHERE FOR SOME (Sample.Person)(Age>65)
ORDER BY Age
ほとんどの述語と同様、以下の例に示すように、NOT 論理演算子を使用して FOR SOME の論理を反転できます。
SELECT Name,Age,COUNT(Name) AS NameCount
FROM Sample.Person
WHERE NOT FOR SOME (Sample.Person)(Age>65)
ORDER BY Age
複数のテーブル
fieldcondition の前に、複数のテーブルをコンマ区切りリストとして指定できます。レコードを返すかどうかを決定する条件では、データの選択元のテーブルを参照できるほか、別のテーブルのフィールド値を参照することもできます。指定する各フィールドとそのテーブルを関連付けるために、通常はテーブルのエイリアスが必要となります。
以下の例では、Sample.Person テーブル内と Sample.Employee テーブル内とで 1 つ以上の Name が一致すれば、すべてのレコードを返します。1 つ以上のレコードでこの条件が True であるため、すべての Sample.Person レコードが返されます。
SELECT Name AS PersonName,Age,COUNT(Name) AS NameCount
FROM Sample.Person
WHERE FOR SOME (Sample.Employee AS e,Sample.Person AS p) (e.Name=p.Name)
ORDER BY Name
以下の例では、Sample.Person テーブル内と Sample.Company テーブル内とで 1 つ以上の Name が一致すれば、すべてのレコードを返します。個人名と企業名が (このデータ・セット内では) 同じにはならないため、この条件はどのレコードでも True にはなりません。したがって、Sample.Person レコードは返されません。
SELECT Name AS PersonName,Age,COUNT(Name) AS NameCount
FROM Sample.Person
WHERE FOR SOME (Sample.Company AS c,Sample.Person AS p) (c.Name=p.Name)
ORDER BY Name