Подход not in
, предложенный Джерри, обычно работает довольно медленно в семействе Interbase / Firebird / Yaffil / RedDatabase, индексы не используются и т. Д.
То же самое относится и к другому возможному представлению Select X from T1 where
NOT EXISTS ( select * from t2 where t2.a = t1.b)
- он может превратитьсятоже очень медленно.
Я согласен, что эти запросы лучше отражают то, что хотел человек, и, следовательно, более читабельны, но, тем не менее, они не рекомендуются в Firebird.Я был сильно укушен в 1990-х, когда делал приложение, похожее на Herbalife, я выбрал этот тип запроса, заключенный в цикл, для ежемесячного подсчета снизу вверх - update ... where not exists ...
- и каждая итерация масштабировалась как o (n ^ 2).) в Interbase 5.5.Конечно, с тех пор Firebird 3 проделал большой путь, но этот «прямой» подход все еще не рекомендуется.
Более традиционный для SQL и FB-дружественный способ выразить его, хотя и менее прямой и труднее для чтения,быть Select t1.x from t1 LEFT JOIN t2 on t1.a=t2.b WHERE t2.y IS NULL