Необычная ситуация - и я совсем не уверен, что понимаю, почему у вас есть ПРАВИЛЬНОЕ СОЕДИНЕНИЕ в условиях ЛЕВОГО СОЕДИНЕНИЯ; это то, что замыкает мой мозг.
У вас есть 4 таблицы:
- Order - столбцы OrderID, RegionID, ...
- Регион - столбцы RegionID, ...
- Rate - столбцы RateID, SalesID, ...
- RateSet - столбцы RateSetID, OrderID, ...
Можно предположить, что для таблицы Xyz столбец XyzID является первичным ключом таблицы. Можно предположить, что столбец PqrID в таблице ссылок на таблицу Pqr (за исключением SalesID, у которого нет соответствующей таблицы Sales - но, похоже, он быть внешним ключом для присоединения к Rate и RateSet (непонятное несоответствие в схеме).
Было бы полезно предоставить эту информацию в вопросе. Таким образом, вы могли бы получить ответ и быстрее.
С данным ордером, похоже, связан один (возможно, несколько) наборов ставок. Учитывая имя, кажется, что данный набор тарифов может иметь ряд тарифов, связанных с ним, включая ноль. Не ясно, можно ли создать заказ без каких-либо связанных наборов ставок, поэтому мы будем придерживаться консервативного мнения, что это может произойти.
Не думаю, что нам нужно выбирать из региона; RegionID в таблице заказов является достаточной идентификацией региона. Следующий запрос перечисляет информацию о заказе для каждого Заказа, в котором либо нет информации в таблице RateSet, либо нет в таблице тарифов для RateSet.
SELECT DISTINCT O.*
FROM Order AS O
LEFT JOIN RateSet AS S ON S.OrderID = O.OrderID
LEFT JOIN Rate AS T ON T.SalesID = S.RateSetID
WHERE T.RateID IS NULL
Теперь, в каких регионах есть один или несколько заказов, но нет ни одного из заказов для этого региона?
SELECT G.RegionID
FROM Region AS G
WHERE NOT EXISTS
(SELECT DISTINCT O.RegionID
FROM Order AS O
JOIN RateSet AS S ON O.OrderID = S.OrderID
JOIN Rate AS T ON S.RateSetID = T.SalesID
)
В подвыборе перечислены значения RegionID заказов, которым назначена ставка - использование внутренних объединений означает, что будут выбраны только строки со скоростью. Регионы, не включенные в этот список, являются единственными кандидатами в «регионы, где ни один из заказов не имеет ставки». Итак, мы объединяем эту таблицу с предыдущим запросом:
SELECT DISTINCT O.*
FROM Order AS O
LEFT JOIN RateSet AS S ON S.OrderID = O.OrderID
LEFT JOIN Rate AS T ON T.SalesID = S.RateSetID
JOIN (SELECT G.RegionID
FROM Region AS G
WHERE NOT EXISTS
(SELECT DISTINCT O.RegionID
FROM Order AS O
JOIN RateSet AS S ON O.OrderID = S.OrderID
JOIN Rate AS T ON S.RateSetID = T.SalesID
)
) AS K ON O.RegionID = K.RegionID
WHERE T.RateID IS NULL
Структура схемы достаточно необычна, так что я не уверен в этом - но она выглядит правильно.