Соединение - поля в таблице 2 переопределяют поля в таблице 1 - PullRequest
6 голосов
/ 07 марта 2011

У меня есть таблица продуктов, в которой хранятся "основные" цены:

продуктов
=========.
id
partnum
описание
цена
время установки

Дилеры могут переопределить прейскурантную цену, установив другую цену, время установки и т. Д. Моя мысль заключалась в том, чтобы хранить различия, характерные для дилерав другой таблице:

переопределения
==========.
dealerID
partnum
цена
время установки

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

SELECT partnum, price, installtime FROM products  
JOIN overrides ON products.partnum = overrides.partnum  
WHERE dealerID = 123

Как написано, это даст ошибку, конечно.Дело в том, что мне нужна цена из таблицы переопределений, если она существует вместо цены в таблице продуктов (то же самое для времени установки).Я мог бы использовать разные имена полей и переместить логику на уровень PHP.Но SQL должен быть в состоянии справиться с этим, верно?

Ответы [ 2 ]

12 голосов
/ 07 марта 2011

Используйте LEFT JOIN вместе с IFNULL, чтобы сначала проверить переопределения, и откат, если переопределения не существует.

SELECT p.partnum, 
    IFNULL(d.price, p.price) AS price,
    IFNULL(d.installtime, p.installtime) AS installtime
FROM products p 
  LEFT JOIN overrides d ON d.dealerID = 123
      AND p.partnum = d.partnum  

Примечание. Я переместил WHERE dealerID = 123 в предикат объединения, чтобы получить все продукты и переопределения для конкретного дилера.

4 голосов
/ 07 марта 2011

Сделайте это как левое соединение, а затем используйте объединение для каждого поля, с первым столбцом переопределения. Coalesce возвращает первый ненулевой аргумент.

select coalesce(overrides.partnum, products.partnum) ... etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...