Должно ли использовать это SQL-заявление для рефракса?

StackOverflow https://stackoverflow.com/questions/1635328

Вопрос

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>

Большинство из этих изменений были бы косметическими, областями о том, на что можно сосредоточиться, будет определяться проблемами, которые вы видите с заявлением.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top