Должно ли использовать это SQL-заявление для рефракса?
-
06-07-2019 - |
Вопрос
SELECT DISTINCT group_id
, supplier_id
, supplier_name
, site_division_id
, site_division_name
FROM view_supplier_site
WHERE supplier_id IN (SELECT DISTINCT supplier_id
FROM view_supplier
WHERE YEAR IN (2008, 2009)
AND received_quantity > 0
AND COE_SUPPLIER NOT IN ('X - LG', 'Y - LG', 'Z - LG') )
Решение
Незаконный факторинг:
SELECT vss.group_id,
vss.supplier_id,
vss.supplier_name,
vss.site_division_id,
vss.site_division_name
FROM view_supplier_site vss
JOIN (SELECT vs.supplier_id
FROM view_supplier vs
WHERE vs.year IN (2008, 2009)
AND vs.received_quantity > 0
AND vs.coe_supplier NOT IN ('X - LG', 'Y - LG', 'Z - LG')
GROUP BY vs.supplier_id) s ON s.supplier_id = vss.supplier_id
GROUP BY vss.group_id, vss.supplier_id, vss.supplier_name, vss.site_division_id, vss.site_division_name
Использование подзаконного факторинга:
WITH suppliers AS (
SELECT vs.supplier_id
FROM view_supplier vs
WHERE vs.year IN (2008, 2009)
AND vs.received_quantity > 0
AND vs.coe_supplier NOT IN ('X - LG', 'Y - LG', 'Z - LG')
GROUP BY vs.supplier_id)
SELECT vss.group_id,
vss.supplier_id,
vss.supplier_name,
vss.site_division_id,
vss.site_division_name
FROM view_supplier_site vss
JOIN suppliers s ON s.supplier_id = vss.supplier_id
GROUP BY vss.group_id, vss.supplier_id, vss.supplier_name, vss.site_division_id, vss.site_division_name
Они эквивалентны.
Другие советы
Я бы предложил следующее:
- Вместо использования
IN
, Используйте внутреннее соединение (вероятно, не улучшение производительности, но утверждение выглядит «приятнее») - Это позволило бы вам избавиться от
DISTINCT
на view_suppler (опять же, наверное не разница производительности) - Требуется ли у View_supplier? Есть некоторые идентификаторы, которые могут быть ключевыми для поставщиков.
NOT IN
может быть проблемой производительности .. Можете ли вы изменить это во что-то другое, как<'X - LG'
или так?- Если представления более чем просто «псевдонимы» для базовых таблиц / столбцов, могут быть способы использования базовых таблиц.
- Еще одна вещь, чтобы посмотреть, будут показатели.
- Это год расчетной колонки? Если это просто
YEAR(datevalue)
Может быть бы быстрее использовать что-то вродеdatevalue between <Jan1st> and <Dec31>
Большинство из этих изменений были бы косметическими, областями о том, на что можно сосредоточиться, будет определяться проблемами, которые вы видите с заявлением.
Не связан с StackOverflow