Minus
Logical AND NOT
Signature
minus(left: Relation, right: Relation) -> Relation
Examples
minus(
restrict(suppliers, eq(:city, 'Paris')),
restrict(suppliers, gt(:status, 10)))
Description
Computes the relation as the set difference of left
and right
.
The left
and right
relations must be minus-compatible, which meaning
that they must have same heading (type inheritance is partly supported
through ruby's own type system, so that the actual behavior is slighlty more
permissive).
Implementation notes
Unlike SQL, this operator ALWAYS remove duplicates. There is no way, in Alf, to compute bags of tuples and therefore no way to express something such as SQL's EXCEPT ALL.
It is sometimes idiomatic in Alf to use intersect
as a logical AND NOT, as
illustrated below. So far, the optimizer/compiler is not smart enough to
translate the former into the latter (which is likely to have a better query
plan when using faithful SQL compilation and available SQL DBMSs). Any patch
is welcome here too!
minus(
restrict(suppliers, eq(:city, 'Paris')),
restrict(suppliers, gt(:status, 10)))
is equivalent to
restrict(suppliers, eq(:city, 'Paris') & !gt(:status, 10))