Возвращение строк для региона, где в MySQL не было продаж - PullRequest
0 голосов
/ 16 декабря 2010

Я пытаюсь создать запрос mySql, чтобы вернуть список заказов, для которых им не назначена ставка. В настоящее время у меня есть:

SELECT * FROM Order
RIGHT JOIN Region ON Region.RegionID = Order.RegionID
LEFT JOIN RateSet ON RateSet.OrderID  = Order.OrderID  
LEFT JOIN Rate ON Rate.SalesID = RateSet.RateSetID
WHERE Rate.RateID IS NULL

Похоже, что вышеупомянутый запрос достигает этого, однако я хочу сделать еще один шаг вперед и возвращать заказы только в том случае, если все заказы в регионе не имеют ставки.

Очень ценю любую помощь

1 Ответ

0 голосов
/ 07 мая 2011

Необычная ситуация - и я совсем не уверен, что понимаю, почему у вас есть ПРАВИЛЬНОЕ СОЕДИНЕНИЕ в условиях ЛЕВОГО СОЕДИНЕНИЯ; это то, что замыкает мой мозг.

У вас есть 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

Структура схемы достаточно необычна, так что я не уверен в этом - но она выглядит правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...