在采用标准之前应用聚合函数

时间:2016-07-18 09:36:22

标签: mysql

我有两个表,TABLE_A和TABLE_B。这就是我想要做的事情:在TABLE_A中获取FIELD_2的所有唯一出现,以及每个出现最高的FIELD_1。然后,只选择我在那里的FIELD_1的那些,其中TABLE_B中的相应FIELD_3不是' OK'。 (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)返回TABLE_A中最高的FIELD_1,其中相应的FIELD_3&lt;&gt; &#39;确定&#39 ;.换句话说,首先应用where语句,然后然后选择最高的FIELD_1。我需要先选择A.FIELD_2和MAX(A.FIELD_1),然后选择 ,只选择B.FIELD_3&lt;&gt;的那些事件。 &#39; OK&#39;

我该怎么做?

1 个答案:

答案 0 :(得分:0)

我不明白你在哪里应用了你的第一个要求:

  

在TABLE_A

中获取FIELD_2的所有唯一匹配项

我希望您的查询中会看到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'