DIFFERENCE関数

DIFFERENCE行関数は、同じデータ型の2つのセットを取得して、2番目のセットには存在しない、最初のセットのすべての要素を含む1つのセットを返します。

DIFFERENCE関数の構文は次のとおりです。
DIFFERENCE(<set1>, <set2>)
ここで、
  • set1はセット・データ型の1つのセットです(mdex:string-setなど)。たとえば、set1は、複数割当ての文字列属性にすることができます。
  • set2set1と同じセット・データ型の1つのセットです。たとえば、set1が複数割当ての文字列属性である場合は、set2も文字列のセットにする必要があります(別の複数割当ての文字列属性など)。
次に、結果の例をいくつか示します({ }は空のセットを表しています)。
DIFFERENCE({ 1, 2, 3, 4, 5 }, { 1, 3, 5 }) = { 2, 4 }
DIFFERENCE({ }, { 1, 3, 5 }) = { }
DIFFERENCE({ 1, 2, 3 }, { }) = { 1, 2, 3 }
DIFFERENCE({ 1, 2 }, { 'a', 'b' }) yields a checking error because the two sets are not of the same data type

DIFFERENCEの例

下に示す例では、BodyとFlavorsの両方が複数割当ての文字列属性です。5つのレコードの値はそれぞれ次のようになります。
Record 5: Body=Earthy, Silky, Tannins
          Flavors=Blackberry, Earthy, Toast
Record 6: Body=Robust
          Flavors=Berry, Plum, Zesty
Record 7: Body=Silky, Tannins
          Flavors=Cherry, Pepper, Prune
Record 8: Body=Oak, Robust
          Flavors=Cherry, Oak, Raspberry
Record 9: Body=Fruit, Strawberry, Silky, Tannins
          Flavors=Fruit, Earthy, Strawberry
最初に、Flavorsセットには存在しない、Bodyセットの要素をすべて取得します。
RETURN results AS
SELECT 
   WineID AS idRec,
   DIFFERENCE(Body, Flavors) AS diffAttrs
FROM WineState
WHERE WineID BETWEEN 5 AND 9
ORDER BY idRec
この文の結果は次のようになります。
diffAttrs              idRec
----------------------------
| { Silky, Tannins }   | 5 |
| { Robust }           | 6 |
| { Silky, Tannins }   | 7 |
| { Robust }           | 8 |
| { Silky, Tannins }   | 9 |
----------------------------

レコード5、7および9はBodyセット内に"Silky"と"Tannins"がありますが、これらの値はFlavorsセット内には存在しません。同様に、レコード6および8はBodyセット内に"Robust"がありますが、この値はFlavorsセット内には存在しません。

次に、2つのセット間の相違比較を反対にします。この文は最初の例と同じですが、FlavorsがBodyのかわりに最初の引数になっている点が異なります。
RETURN results AS
SELECT 
   WineID AS idRec,
   DIFFERENCE(Flavors, Body) AS diffAttrs
FROM WineState
WHERE WineID BETWEEN 5 AND 9
ORDER BY idRec
この場合、文の結果は前とは異なります。
diffAttrs                     idRec
-----------------------------------
| { Blackberry, Toast }       | 5 |
| { Berry, Plum, Zesty }      | 6 |
| { Cherry, Pepper, Prune }   | 7 |
| { Cherry, Raspberry }       | 8 |
| { Earthy }                  | 9 |
-----------------------------------

出力の例としてレコード9を見てみると、"Earthy"は最初のセット(Flavorsセット)の唯一の要素ですが、これは2番目のセット(Bodyセット)には存在しません。