Перезаписать / объединить таблицу MySQL с другой таблицей на выбор - PullRequest
1 голос
/ 04 февраля 2011

У меня есть две таблицы продуктов.Таблица A является таблицей «по умолчанию» (поступает из данных автоматически обновляется еженедельно).Таблица B используется для ручной перезаписи значений в Таблице A и имеет те же столбцы, что и Таблица, плюс еще несколько.Обе таблицы всегда имеют одинаковый столбец UniqueID.

Мне нужен оператор выбора, который извлекает все значения из A и все значения из B, при этом B перезаписывает значения из A, ЕСЛИ МЕНЬШЕ значение из B равно нулю, = до 0 или равно 0,00 (набор столбцов установлен)целое число с двумя десятичными знаками и заполнено "0").

Я пытался использовать LEFT JOIN, но у меня проблемы со значениями NULL и "0".

Я использую данные в php и могу с ними справиться, когда мне нужно только потянуть в 1 строку.Я запрашиваю для каждого, извлекаю массив ассоциаций для A, фильтрую массив B и затем извлекаю его.Но этот процесс становится очень неуклюжим, когда начинают тянуть в 20-200 строк.

Таблица A имеет около 400 000 строк и не может видеть, как B набирает более 10 000–20 000.

Спасибо за вашу помощь.

ОБНОВЛЕНИЕ: Вот код, который я получил, чтобы работать.

SELECT a.UniqueId, IF(b.Color, b.Color, a.Color) as Color, IF(b.Price1 = 0, a.Price1, b.Price1) as Price1, b.SPrice1 FROM productdata a LEFT JOIN product_overrides b ON a.UniqueID = b.UniqueID WHERE a.UniqueID = $prod";

ОБНОВЛЕНИЕ 2: Так проще, тем лучше.IF () обращается как к нулю, так и к нулю.

IF (expr1, expr2, expr3)

Если expr1 равен TRUE ( expr1 <> 0 и expr1 <> NULL )тогда IF () возвращает expr2;в противном случае возвращается expr3.IF () возвращает числовое или строковое значение, в зависимости от контекста, в котором оно используется.

SELECT a.UniqueId, IF(b.Color, b.Color, a.Color) as Color, IF(b.Price1, b.Price1, a.Price1) as Price1, b.SPrice1 FROM productdata a LEFT JOIN product_overrides b ON a.UniqueID = b.UniqueID WHERE a.UniqueID = $prod";

1 Ответ

3 голосов
/ 04 февраля 2011

Я думаю, что это должно охватить все ваши сценарии:

SELECT 
   COALESCE(b.nullablefield, a.nullablefield) as nullablefield,
   IF(b.intfield = 0, a.intfield, b.intfield) as intfield,
   IF(b.floatfield = 0, a.floatfield, b.floatfield) as floatfield,
   ... etc ...
FROM table_a a
LEFT JOIN table_b b ON a.UniqueID = b.UniqueID
...