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

Это сложно объяснить, поэтому я сделаю все возможное.

У меня есть таблица, состоящая из строк по умолчанию (отмеченных NULL specificSiteID) и переопределенных строк (отмеченных NON- NULL specificSiteID с.)

Оба типа строк используют genericID для определения загружаемых данных - иногда для некоторых данных могут не быть значения по умолчанию.

edit 1: Non-null specificSiteID s, на которые я ссылаюсь, переопределяет значение по умолчанию, только когда их siteID совпадает с тем, для которого я запрашиваю.Я не применяю все переопределения к одному значению по умолчанию - я применяю только переопределение specificSiteID к значению по умолчанию. end edit 1

У меня есть четыре требования к этому запросу:

  1. Не возвращать данные, если нет ни переопределения по умолчанию, ни переопределения для строки.
  2. Возвращает данные переопределения, когда нет данных по умолчанию
  3. Возвращает данные переопределения, перезаписывая данные по умолчанию, где данные переопределения не равны нулю
  4. и, наконец, возвращает только данные по умолчанию, когдаон существует, и данные переопределения отсутствуют.

Прямо сейчас мой SQL-запрос выглядит так: *

SELECT COALESCE( override.Col1 , default.Col1) as Col1,
 COALESCE(override.Col2, default.Col2) as Col2
 FROM
  (SELECT * from tableA where 
     genericID = 84 AND 
     specificSiteID IS NULL ) as default
 LEFT JOIN
  (SELECT * from tableA where 
     genericID = 84 AND 
     specificSiteID = 34 ) as override
 ON default.genericID = override.genericID;

Проблема этого сценария заключается в том, что в случае сбоя № 2 из-заLEFT JOIN. Когда по умолчанию нет строки для LEFT JOIN, строка переопределения не включается. Используя приведенный выше пример, если нет genericID = 84, где specificSiteID равно NULL, данные отсутствуютвозвращается, даже если есть переопределенные данные.

Что за JOIN я ищу?Могу ли я даже покрыть это JOIN?

1 Ответ

1 голос
/ 05 февраля 2011

Поскольку Mysql не поддерживает полное соединение, но вы можете смоделировать его, используя "левое соединение" + "правое соединение".

Я думаю, что genericID 34 и specificSiteID 84 являются примерами, и вам нужно объединить все genericID, где specificSiteId имеет значение null (по умолчанию) и не равно null (переопределить), не так ли?

SELECT COALESCE( override.Col1 , default.Col1) as Col1,
       COALESCE(override.Col2, default.Col2) as Col2
  FROM (SELECT * from tableA where specificSiteID IS NULL ) as default
        LEFT JOIN  (SELECT * from tableA where specificSiteID is not null ) as override
               ON default.genericID = override.genericID
UNION 
SELECT COALESCE( override.Col1 , default.Col1) as Col1,
       COALESCE(override.Col2, default.Col2) as Col2
  FROM (SELECT * from tableA where specificSiteID IS NULL ) as default
        RIGHT JOIN  (SELECT * from tableA where specificSiteID is not null ) as override
               ON default.genericID = override.genericID

Но, глядя на этот запрос, кажется, что ваш дизайн БД не подходит для вашего случая

...