У меня есть две таблицы: TABLE_A и TABLE_B. Это то, что я хочу сделать. Возьмите все уникальные вхождения FIELD_2 в TABLE_A вместе с самым высоким значением FIELD_1 для каждого из них. Затем выберите только те из FIELD_1, которые у меня есть, где соответствующий FIELD_3 в TABLE_B не является «ОК». (FIELD_1 существует как в TABLE_A, так и в TABLE_B.)Применить агрегированную функцию, прежде чем принимать критерии.
Сначала я начал с простого подхода, когда я сделал это в три этапа, как описано выше. (Для того, чтобы посмотреть, что я сделал это проще всего начать с шагом 1, и работать ваш путь наружу, то есть, как я написал код):
/* START Step 3 – Take only those of the highest FIELD_1 from TABLE_A, where the corresponding FIELD_3 in TABLE_B is not ‘OK’ */
SELECT DISTINCT
FIELD_1
FROM
TABLE_B
WHERE
FIELD_1 IN
(
/* START Step 2 – Take only the highest FIELD_1 from Step 1 */
SELECT
MAXFIELD_1
FROM
(
/* START Step 1 – Take the highest FIELD_1 for all of the FIELD_2 which are in TABLE_A */
SELECT
FIELD_2,
MAX(FIELD_1) MAXFIELD_1
FROM
TABLE_A
GROUP BY
FIELD_2
/* END Step 1 */
)
/* END Step 2 */
)
AND
FIELD_3 <> 'OK'
/* END Step 3 */
Однако, как я по-прежнему с тем, что я хочу сделать, это становится уродливый и уродливый, и я ищу способ сократить его, используя инструкцию JOIN. Сначала я попытался это:
SELECT
A.FIELD_2,
MAX(A.FIELD_1) FIELD_1
FROM
TABLE_A A
INNER JOIN TABLE_B B ON A.FIELD_1 = B.FIELD_1
WHERE
B.FIELD_3 <> 'OK'
GROUP BY
A.FIELD_2
К сожалению, что теперь, кажется, случается, что MAX (A.FIELD_1) возвращает наибольшее FIELD_1 в TABLE_A, где соответствующий FIELD_3 <> «OK». Другими словами, оператор where применяется сначала, , затем выбран самый высокий FIELD_1. Мне нужно сначала выбрать A.FIELD_2 и MAX (A.FIELD_1) и после этого, взять только те вхождения, где B.FIELD_3 <> 'OK'.
Как это сделать?
Hello! Спасибо за ваш ответ. К сожалению, это не сработало. Я сделал одну поправку, чтобы иметь возможность запускать ее, а именно, что я добавил B.FIELD_3 в GROUP BY. Результат - это те же самые записи, что и в моей предыдущей попытке. Я думаю, что проблема может быть связана с тем, что я включаю B: FIELD_3 в начале. То есть, во-первых, в SELECT-термине я получаю наивысший A.FIELD_1 для каждого вхождения B.FIELD_3. Итак, я получаю запись как для самого высокого A.FIELD_1, где B.FIELD_3 - это «ОК», а также один с самым высоким A.FIELD_1 для всех остальных B.FIELD_3. – CupofTea
Затем, когда я включаю термин HAVING, я в конечном итоге выбираю только самый высокий B: FIELD_3, где A.FIELD_1 не был «ОК», чего я пытался избежать. Я также пытался запустить его без B.FIELD_3 в начале SELECT, но он все еще не работал. – CupofTea
Кстати, в начале вы сказали, что в запросе ожидаете DISTINCT. Я думал, что мне не нужно использовать DISTINCT, когда я использую GROUP BY, но, возможно, я неправильно понял. – CupofTea