Объединения на основе неравенства
Иногда объединять таблицы нужно на условиях, отличных от равенства. Применение объединений равенства основано на отношениях первичного и внешнего ключа, однако в отношении объединений неравенства все не так. Такие объединения обычно наполняют результирующий набор данных информацией, которая на практике не имеет смысла. К примеру, если заменить знак равенства в условии объединения предыдущего примера знаком неравенства, в результирующий набор данных войдут все комбинации заказчиков и номеров телефонов, за исключением тех, которые реально существуют (рис. 9.2). Другими словами, результирующий набор данных будет подобен декартову произведению двух множеств (т. е. перекрестному объединению, описываемому далее).
В то же время в некоторых ситуациях объединения, создаваемые на основе условий неравенства, могут оказаться полезными. Для примера предположим, что в компании ACME существуют следующие правила бизнес-логики. Для заказов с общей суммой меньше 10 тыс. долларов не существует скидок; 2-процентная скидка устанавливается для заказов в сумме от 10000 до 14999 долларов; на заказы в сумме от 15000 до 19999 долларов устанавливается скидка 3%, а на заказы с большей суммой дается скидка в 4%. Одним из способов реализации подобных правил является создание отдельной таблицы, хранящей минимальные и максимальные суммы заказов, а также соответствующие им скидки (рис. 9.3). Рекомендуется всегда создавать для хранения потенциально изменяющихся значений отдельные таблицы (к примеру, если максимальная скидка в компании ACME изменится с 4-х до 3,5 процентов). В этом случае при изменении значения будет достаточно обновить значение в этой таблице, что несравненно легче, чем изменять текст программы и заново компилировать приложение. В предыдущем примере было представлено объединение неравенства между представлением V_CUSTOMER_TOTALS (отображающим суммы заказов) и таблицей скидок DISCOUNT. В запросе вычисляются суммы скидок, получаемые путем умножения соответствующего процента на общую сумму заказа в соответствии с изложенными ранее правилами бизнес-логики.