Оптимизация данных Best Fit с использованием левого соединения в MySQL - PullRequest
0 голосов
/ 15 ноября 2018

Ниже я кое-что пытаюсь достичь.

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

Одно и то же имя может иметь максимум 3 вхождения в таблице и минимум 1.

Сравнение данных должно происходить по всем 3 строкам или 2 строкам (еслиимя не было получено из одного источника), если для данного имени существует более одного вхождения.Если для данного имени есть только 1 строка, которую следует принять в качестве значения по умолчанию.

Это моя попытка.

select 
case
when (coalesce(length(A.x_manufacturer),0) > coalesce(length(B.x_manufacturer),0) AND coalesce(length(A.x_manufacturer),0) > coalesce(length(C.x_manufacturer),0))  then A.x_manufacturer
when (coalesce(length(B.x_manufacturer),0) > coalesce(length(A.x_manufacturer),0) AND coalesce(length(B.x_manufacturer),0) > coalesce(length(C.x_manufacturer),0))  then B.x_manufacturer
when (coalesce(length(C.x_manufacturer),0) > coalesce(length(A.x_manufacturer),0) AND coalesce(length(C.x_manufacturer),0) > coalesce(length(B.x_manufacturer),0)) then C.x_manufacturer
 else C.x_manufacturer end as Best_Fit_x_manufacturer
from tbl1 A left outer join tbl1 B on 
A.name = B.name 
left outer join tbl1 C on C.name = B.name 
where A.sourceid=1 and B.sourceid=2 and C.sourceid=3  group by 
  C.name

Пример данных в таблице:

Name  ManuFacturer source
A     AB           1
A     ABC          2
A     ABCD         3
B     BC           1

Ожидаемый результат

Name      ManuFacturer source
A         ABCD         3
B         BC           1

1 Ответ

0 голосов
/ 15 ноября 2018

Как только вы поместите твердое условие на внешнюю объединенную таблицу в предложение WHERE, объединение вернется к поведению соединения INNER:

from 
  tbl1 A 
  left outer join tbl1 B on A.name = B.name 
  left outer join tbl1 C on C.name = B.name 
where 
  A.sourceid=1 and 
  B.sourceid=2 and --wrong; this will cause A outer join B to become an INNER join
  C.sourceid=3     --wrong; this will cause B outer join C to become an INNER join

Вместо этого включите предложения:

from 
  tbl1 A 
  left outer join tbl1 B on A.name = B.name AND B.sourceid=2
  left outer join tbl1 C on C.name = B.name AND C.sourceid=3
where 
  A.sourceid=1

Причина почему:

Внешние объединения генерируют NULL в каждом столбце, если нет совпадения между строками, следовательно, B.sourceid вполне может быть нулевым в некоторых строках набора результатов. Указание WHERE B.sourceid=2 приводит к исчезновению всех строк, в которых sourceid равен нулю, поскольку 2 не равно нулю (ничто не равно нулю). Это означает, что единственные строки, которые вы можете из него получить, - это строки, в которых есть совпадение. Что является внутренним соединением

...