0

これが私のSQLクエリです。テーブル A がありますが、このテーブルを HAVING (A.CATEGORY) に使用しようとすると、エラーが表示されますORA-00979: not a GROUP BY expression。逆に、テーブル A のすべてのコードを同じ場所にコピーすると機能します。このクエリを最初の方法でうまく動作させるにはどうすればよいですか? ありがとう

最初 (正しくない):

SELECT
    DEMO_PRODUCT_INFO.PRODUCT_NAME
FROM
    DEMO_PRODUCT_INFO,
    (SELECT
        DEMO_PRODUCT_INFO.CATEGORY
     FROM
        DEMO_PRODUCT_INFO
    HAVING
        MAX(DEMO_PRODUCT_INFO.LIST_PRICE) 
        = (SELECT MAX(MAX(DEMO_PRODUCT_INFO.LIST_PRICE)) 
             FROM DEMO_PRODUCT_INFO 
            GROUP BY DEMO_PRODUCT_INFO.CATEGORY)
    GROUP BY
        DEMO_PRODUCT_INFO.CATEGORY) A
WHERE
    DEMO_PRODUCT_INFO.CATEGORY = A.CATEGORY
HAVING
    MIN(DEMO_PRODUCT_INFO.LIST_PRICE) 
    = (SELECT MIN(DEMO_PRODUCT_INFO.LIST_PRICE) 
        FROM DEMO_PRODUCT_INFO 
       WHERE DEMO_PRODUCT_INFO.CATEGORY = A.CATEGORY 
       GROUP BY DEMO_PRODUCT_INFO.CATEGORY)
GROUP BY
    DEMO_PRODUCT_INFO.PRODUCT_NAME

2 番目 (正しい):

SELECT
    DEMO_PRODUCT_INFO.PRODUCT_NAME
FROM
    DEMO_PRODUCT_INFO,
    (SELECT
        DEMO_PRODUCT_INFO.CATEGORY
     FROM
        DEMO_PRODUCT_INFO
    HAVING
        MAX(DEMO_PRODUCT_INFO.LIST_PRICE) 
        = (SELECT MAX(MAX(DEMO_PRODUCT_INFO.LIST_PRICE)) 
             FROM DEMO_PRODUCT_INFO 
            GROUP BY DEMO_PRODUCT_INFO.CATEGORY)
    GROUP BY
        DEMO_PRODUCT_INFO.CATEGORY) A
WHERE
    DEMO_PRODUCT_INFO.CATEGORY = A.CATEGORY
HAVING
    MIN(DEMO_PRODUCT_INFO.LIST_PRICE) 
    = (SELECT MIN(DEMO_PRODUCT_INFO.LIST_PRICE) 
        FROM DEMO_PRODUCT_INFO 
       WHERE DEMO_PRODUCT_INFO.CATEGORY 
             = (SELECT DEMO_PRODUCT_INFO.CATEGORY
                  FROM DEMO_PRODUCT_INFO
                HAVING MAX(DEMO_PRODUCT_INFO.LIST_PRICE) 
                       = (SELECT MAX(MAX(DEMO_PRODUCT_INFO.LIST_PRICE)) 
                            FROM DEMO_PRODUCT_INFO 
                           GROUP BY DEMO_PRODUCT_INFO.CATEGORY)
                 GROUP BY DEMO_PRODUCT_INFO.CATEGORY) 
       GROUP BY DEMO_PRODUCT_INFO.CATEGORY)
GROUP BY
    DEMO_PRODUCT_INFO.PRODUCT_NAME
4

2 に答える 2

0

GROUP BY 句は HAVING 句の前に置きます。これは正しい順序です:

SELECT ...
FROM ...
WHERE ...
GROUP BY ...
HAVING ...
于 2013-08-30T11:51:35.120 に答える
0

私はあなたがやろうとしていることの 100% ではありませんが、エラーはスクリプトのこのセクションが原因です:

HAVING
    MIN(DEMO_PRODUCT_INFO.LIST_PRICE) 
    = (SELECT MIN(DEMO_PRODUCT_INFO.LIST_PRICE) 
        FROM DEMO_PRODUCT_INFO 
       WHERE DEMO_PRODUCT_INFO.CATEGORY = A.CATEGORY 
       GROUP BY DEMO_PRODUCT_INFO.CATEGORY)

select min(ilst_price)...group by categorylist_prices のリストを生成します。したがって、実質的にこのhaving句は、「カテゴリ別にグループ化された、最小 list_prices が最小 list_prices のリストと等しい行のみ」と言っています。もちろん、これは非論理的です。

カテゴリの最小 list_price が必要だと思いますか? を削除する必要がありますgroup by。また、min()周囲の list_price は、内側の選択の外側にある必要があります。完全な作業バージョンは次のとおりです。

SELECT
    DEMO_PRODUCT_INFO.PRODUCT_NAME
FROM
    DEMO_PRODUCT_INFO,
    (SELECT
        DEMO_PRODUCT_INFO.CATEGORY
     FROM
        DEMO_PRODUCT_INFO
    HAVING
        MAX(DEMO_PRODUCT_INFO.LIST_PRICE) 
        = (SELECT MAX(MAX(DEMO_PRODUCT_INFO.LIST_PRICE)) 
             FROM DEMO_PRODUCT_INFO 
            GROUP BY DEMO_PRODUCT_INFO.CATEGORY)
    GROUP BY
        DEMO_PRODUCT_INFO.CATEGORY) A
WHERE
    DEMO_PRODUCT_INFO.CATEGORY = A.CATEGORY
HAVING
    MIN(DEMO_PRODUCT_INFO.LIST_PRICE) 
    = MIN((SELECT MIN(DEMO_PRODUCT_INFO.LIST_PRICE)
        FROM DEMO_PRODUCT_INFO 
       WHERE DEMO_PRODUCT_INFO.CATEGORY = A.CATEGORY))
GROUP BY
    DEMO_PRODUCT_INFO.PRODUCT_NAME
于 2013-08-30T13:11:32.397 に答える