2016-07-18 2 views
0

У меня есть две таблицы: 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'.

Как это сделать?

ответ

0

Я не понимаю, где вы применили свое первое требование:

Возьмите все уникальные вхождения FIELD_2 в TABLE_A

Я ожидал увидеть DISTINCT ключевое слово в запросе.

Тем не менее, если вы хотите отфильтровать B.FIELD_3 <> 'OK' после приема полей A.FIELD_2 и MAX(A.FIELD_1), вы можете использовать пункт HAVING.

SELECT 
    A.FIELD_2, 
    MAX(A.FIELD_1) FIELD_1, 
    B.FIELD_3, 
FROM 
    TABLE_A A 
    INNER JOIN TABLE_B B ON A.FIELD_1 = B.FIELD_1 
GROUP BY 
    A.FIELD_2 
HAVING 
    FIELD_3 <> 'OK' 
+0

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

+0

Затем, когда я включаю термин HAVING, я в конечном итоге выбираю только самый высокий B: FIELD_3, где A.FIELD_1 не был «ОК», чего я пытался избежать. Я также пытался запустить его без B.FIELD_3 в начале SELECT, но он все еще не работал. – CupofTea

+0

Кстати, в начале вы сказали, что в запросе ожидаете DISTINCT. Я думал, что мне не нужно использовать DISTINCT, когда я использую GROUP BY, но, возможно, я неправильно понял. – CupofTea