Объединение действий при поиске нулевого значения

#mysql

#MySQL

Вопрос:

Мне нужно найти значение, которое существует в LoyaltyTransactionBasketItemStores таблице, но не в DimProductConsolidate таблице. Мне нужен код товара и соответствующая ему компания. Это мой запрос

 SELECT
    A.ProductReference, A.CompanyCode
FROM
    (SELECT ProductReference, CompanyCode FROM dwhdb.LoyaltyTransactionsBasketItemsStores GROUP BY ProductReference) A 
LEFT JOIN
    (SELECT LoyaltyVariantArticleCode FROM dwhdb.DimProductConsolidate) B ON B.LoyaltyVariantArticleCode = A.ProductReference
WHERE
    B.LoyaltyVariantArticleCode IS NULL
 

Это довольно простой запрос. Но когда я запускаю его, это занимает 1 час и все еще не завершено. Затем я использую EXPLAIN, и это результат

введите описание изображения здесь

Но когда я удаляю CompanyCode из своего запроса, его производительность значительно возрастает. Это результат ОБЪЯСНЕНИЯ

введите описание изображения здесь

Я хочу знать, почему это происходит, и есть ли какой-либо способ получить ProductReference и его компанию с гораздо более высокой производительностью?

Ответ №1:

Ваш текущий запрос изобилует синтаксическими и структурными ошибками. Я бы использовал здесь логику exists:

 SELECT a.ProductReference, a.CompanyCode
FROM dwhdb.LoyaltyTransactionsBasketItemsStores a
WHERE NOT EXISTS (SELECT 1 FROM dwhdb.DimProductConsolidate b
                  WHERE b.LoyaltyVariantArticleCode = a.ProductReference);
 

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