SQL SUB ВЫБИРАЕТ и ЛЕВЫЕ СОЕДИНЯЕТСЯ с предложением WHERE
Является ли более эффективным оставить предложение WHERE во втором SUB-SELECT. Работает в обоих направлениях, но я ищу наиболее эффективный способ с этим оператором SQL...
Есть много записей и значений для 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
;
2 ответа
Можете ли вы попробовать этот запрос
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 ;
Вы пытаетесь получить статистические значения в запросе с фильтром. Проблема заключается в том, что агрегации выполняются по всем данным, а не по отфильтрованному подмножеству. Итак, ваш запрос повторяет критерии.
Другой подход - это коррелированный подзапрос:
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;