Если вам нужен только один уровень родительско-дочерних отношений (без внуков, внучат и т. Д.)
тогда вы можете просто сделать самостоятельное соединение:
SELECT T.entry_id as child_id, T2.entry_id as parent_id
FROM TableA AS T LEFT JOIN TableA AS T2
ON T.parent_SKU=T2.SKU
Если вы хотите пройти по всему родительско-дочернему дереву, Oracle и MSSQL имеют механизмы, которые позволяют вам это делать. Я не знаком с такой опцией для MySQL.
Там больше информации здесь:
http://ftp.ntu.edu.tw/MySQL/tech-resources/articles/hierarchical-data.html
/55374/mozhno-li-sdelat-rekursivnyi-zapros-sql
Edit:
Хорошо, сначала немного санации данных: я не знаю, является ли это артефактом моего процесса импорта, или он такой же в вашем конце, но в полях parent_sku была добавлена новая строка. Естественно, это привело к ошибке при попытке сопоставить ABC parent_sku ребенка с ABC \ n SKU родителей. Проверьте это с помощью select * from TableA where parent_sku like '%\n'
. Если какие-либо столбцы совпадают, запустите
SET SQL_SAFE_UPDATES = 0;
ОБНОВЛЕНИЕ TableA
SET parent_sku
= ЗАМЕНА (ЗАМЕНА (parent_sku
, '\ r', ''), '\ n', '');
Это удалит новые строки.
То же самое относится и к пустой строке parent_sku's - если они не равны null на вашем конце, сделайте их нулевыми.
Вот пересмотренный запрос - я добавил некоторую фильтрацию перед объединением, и теперь она работает быстрее. Просто дважды проверьте ваши \ n и NULL, и это должно привести к правильному выводу:
SELECT child.entry_id as child_id, parent.entry_id as parent_id
FROM
(
select * from TableA
-- only children have parent_sku
where parent_SKU is not null
-- some extra safety for empty strings,
-- can be removed after empties are replaced by NULLs
and length(parent_SKU) > 0 and length(sku)>0 and length(parent_sku)>0
)
AS child
LEFT JOIN
(
select * from tableA
-- only parents don't have parent_sku
where (parent_SKU is null or length(parent_SKU)=0)
and length(sku)>0
) AS parent
ON child.parent_SKU = parent.SKU
Результаты