2015-10-21 6 views
0

Насколько эффективнее оставить предложение WHERE во втором SUB-SELECT. Работает в обоих направлениях, но я ищу наиболее эффективный способ с этим оператором SQL ...SQL SUB SELECTS и LEFT JOINS with WHERE Пункт

Существует много записей и значений для substr (FIELD_G, 10,3) в таблице 2 t2, поэтому я не уверен, что я должен фильтровать что во 2-м SUB-SELECT перед первым соединением?

Мой вопрос: Должен ли я фильтровать результаты во втором SUB-SELECT до СОЕДИНЕНИЯ или я должен исключить предложение WHERE (во втором SUB-SELECT), получить все и полагаться на LEFTJOIN, чтобы дать мне мои результаты ???

Если CNT равен 0 - Я до сих пор нуждаются в t1.FIELD_A, t1.FIELD_B, t1.FIELD_C, t1.FIELD_D поля должны быть возвращены ...

SELECT t1.FIELD_A, t1.FIELD_B, t1.FIELD_C, t1.FIELD_D, t2.CNT FROM (
    SELECT FIELD_A, FIELD_B, FIELD_C, FIELD_D 
    FROM SCHEMA.TABLE_A 
    WHERE FIELD_A IN ('Z1','Z2','Z3','Z4','Z5','Z6','Z7','Z8','Z9','Z10','Z11','Z12','Z13','Z14','Z15','Z16','Z17','Z18','Z19','Z20','Z21','Z22') 
      ) t1 
    LEFT JOIN 
       (
    SELECT FIELD_A, COUNT(FIELD_A) AS CNT FROM (
    SELECT substr(FIELD_G,10,3) AS FIELD_A 
    FROM SCHEMA.TABLE_B 
    WHERE substr(FIELD_G,10,3) IN ('Z1','Z2','Z3','Z4','Z5','Z6','Z7','Z8','Z9','Z10','Z11','Z12','Z13','Z14','Z15','Z16','Z17','Z18','Z19','Z20','Z21','Z22') 
    ) GROUP BY FIELD_A 
      ) t2 

    ON t1.FIELD_A = t2.FIELD_A 
    ORDER BY t1.FIELD_A 
    ; 
+1

Вы всегда время оба запроса. –

+1

Невозможно, чтобы любой, кто не имеет доступа к вашей базе данных и ее данным, может однозначно заявить, что одна версия запроса будет лучше или хуже. Сравните планы выполнения обоих запросов и (как предлагает @DanBracuk) время выполнения. Удачи. –

+0

Что значит «более эффективный»? –

ответ

0

Вы пытаетесь получить агрегированные значения в запросе с фильтром. Проблема состоит в том, что агрегирование выполняется по всем данным, а не по фильтруемому подмножеству. Таким образом, ваш запрос повторяет критерии.

Другой подход является коррелированных подзапросов:

SELECT t1.FIELD_A, t1.FIELD_B, t1.FIELD_C, t1.FIELD_D, 
     (SELECT COUNT(*) 
     FROM SCHEMA.TABLE_B b 
     WHERE substr(b.FIELD_G, 10, 3) = t1.FIELD_A 
     ) as cnt 
FROM SCHEMA.TABLE_A t1 LEFT JOIN 
WHERE t1.FIELDA IN ('Z1', 'Z2', 'Z3', 'Z4', 'Z5', 'Z6', 'Z7', 'Z8', 'Z9', 'Z10', 
        'Z11', 'Z12', 'Z13', 'Z14', 'Z15', 'Z16', 'Z17', 'Z18', 'Z19', 'Z20', 
        'Z21', 'Z22') 
ORDER BY t1.FIELD_A; 
+0

Gordon - это не работает - неверное имя таблицы рядом с предложением WHERE – Ronald

+0

Ваш первый абзац меня смутил, но я думаю, что это анализ того, почему OP структурировал свой примерный запрос, как и он (в отличие от критики его подхода). –

0

Вы можете попробовать этот запрос,

SELECT t1.FIELD_A, t1.FIELD_B, t1.FIELD_C, t1.FIELD_D, t2.CNT 
    FROM SCHEMA.TABLE_A t1 
    LEFT JOIN (
       SELECT FIELD_A, COUNT(FIELD_A) AS CNT FROM (
       SELECT substr(FIELD_G,10,3) AS FIELD_A 
       FROM SCHEMA.TABLE_B) GROUP BY FIELD_A 
    ) t2 
    ON t1.FIELD_A = t2.FIELD_A 
    WHERE t1.FIELD_A IN ('Z1','Z2','Z3','Z4','Z5','Z6','Z7','Z8','Z9','Z10','Z11','Z12','Z13','Z14','Z15','Z16','Z17','Z18','Z19','Z20','Z21','Z22') 
    ORDER BY t1.FIELD_A ;