Оператор алгебры МИНУС установлен в базе данных Firebird - PullRequest
2 голосов
/ 24 января 2012

У меня есть два одинаковых запроса с различным фильтром, примененным к той же таблице .

Первый запрос возвращает (1,2,3,4,5), а второй возвращает (3,4,5).

Я хочу применить оператор MINUS / EXCEPT:

select1 minus select2 = (1,2)

Как мне реализовать эту логику с использованием Firebird SQL диалекта?(Я использую superserver v2.1)

Я получаю противоположные результаты, выполняя

select1 UNION select2 = (1,2,3,4,5)

спасибо

Ответы [ 2 ]

2 голосов
/ 24 января 2012

В FB нет оператора минус, поэтому:

select x1.fld from table x1 
where
not EXISTS(select x2.fld from table x2 where x2.fld=x1.fld) 
1 голос
/ 24 января 2012

Оператор МИНУС не существует в Firebird. Самое близкое приближение, которое я могу придумать, это что-то вроде примера ниже. Здесь используются общие табличные выражения, представленные в Firebird 2.1, но, конечно, они могут работать и с подзапросами (я просто нахожу CTE более читабельным)

WITH select1 AS (
   SELECT id, ....
),
select2 AS (
   SELECT id, ....
)
SELECT ...
FROM select1 
LEFT JOIN select2 ON select2.id = select1.id -- more conditions...?
WHERE select2.id IS NULL

В этом запросе я использую LEFT JOIN для объединения select1 и select2, а затем сохраняю только те строки из select1, которые не встречаются в select2.

...