1

質問があります:

SELECT MIN(stat_md5) AS stat_md5 
FROM 
     (select * from ( mem_stat NATURAL LEFT OUTER JOIN host ))
GROUP BY stat_md5;

このクエリはSQLiteバージョン3.4.2で正常に実行されていますが、 バージョン にアップグレードする3.7.11と、次のエラーが発生します。

SQL error: aggregate functions are not allowed in the GROUP BY clause

クエリからMIN()orGROUP BYまたはを削除すると、 version で正常に動作します。AS3.7.11

これは、次のクエリのバリアントが正常に機能していることを意味します。

SELECT MIN(stat_md5) AS stat_md5 
FROM 
     (select * from ( mem_stat NATURAL LEFT OUTER JOIN host ))


SELECT MIN(stat_md5) 
FROM 
     (select * from ( mem_stat NATURAL LEFT OUTER JOIN host ))
GROUP BY stat_md5;


SELECT stat_md5 
FROM 
     (select * from ( mem_stat NATURAL LEFT OUTER JOIN host ))
GROUP BY stat_md5;

バージョン 3.7.11 でエラーが発生する理由とその回避策を説明してください。

更新日:

これが元のクエリです。

SELECT 
      stat_day, obs_day, stat_week, obs_week, 
      NULL AS stat_cputotal, stat_memfree, stat_md5,
      stat_month, obs_month, stat_type, stat_memused, stat_10min, obs_10min, 
      NULL AS stat_cpusystem, stat_epoch, obs_epoch, stat_30day, obs_30day, 
      stat_idx, obs_idx, NULL AS stat_cpuidle, stat_memtotal, stat_qtr, obs_qtr,
      NULL AS stat_cpuuser, stat_hour, obs_hour, obs_10min, stat_10min, 
      obs_30day,stat_30day, obs_day, stat_day, obs_epoch, stat_epoch, obs_hour,
      stat_hour, obs_idx, stat_idx, obs_month, stat_month, obs_qtr, stat_qtr, 
      obs_week, stat_week, serial_num, NULL AS dputil_cpuid, NULL AS wms_pk 
      FROM (
       (
       SELECT stat_qtr, obs_qtr, stat_qtr AS cus_qtr, stat_qtr AS crash_qtr, 
              stat_qtr AS evt_qtr, stat_30day, obs_30day, stat_30day AS cus_30day, 
              stat_30day AS crash_30day, stat_30day AS evt_30day, stat_month, 
              obs_month, stat_month AS cus_month, stat_month AS crash_month, 
              stat_month AS evt_month, stat_week, obs_week, stat_week AS cus_week, 
              stat_week AS crash_week, stat_week AS evt_week, stat_day, obs_day, 
              stat_day AS cus_day, stat_day AS crash_day, stat_day AS evt_day, 
              stat_hour, obs_hour, stat_hour AS cus_hour, stat_hour AS crash_hour, 
              stat_hour AS evt_hour, stat_10min, obs_10min, stat_10min AS cus_10min, 
              stat_10min AS crash_10min, stat_10min AS evt_10min, stat_epoch, 
              obs_epoch, stat_epoch AS cus_epoch, stat_epoch AS crash_epoch, 
              stat_epoch AS evt_epoch, stat_idx, obs_idx, stat_idx AS cus_idx, 
              stat_idx AS crash_idx, stat_idx AS evt_idx, obs_10min, obs_30day, 
              obs_day, obs_epoch, obs_hour, obs_idx, obs_month, obs_qtr, obs_week, 
              serial_num, stat_md5, MIN(stat_memfree) AS stat_memfree, MIN(stat_md5) 
              AS stat_md5, MIN(stat_type) AS stat_type, MIN(stat_memused) AS 
              stat_memused, MIN(stat_memtotal) AS stat_memtotal 
              FROM 
                   (select * from ( mem_stat NATURAL LEFT OUTER JOIN host )) 
                    GROUP BY 
                            stat_qtr, stat_30day, stat_month, stat_week, 
                            stat_day, stat_hour, stat_10min, stat_epoch, 
                            stat_idx, obs_10min,obs_30day, obs_day, obs_epoch, 
                            obs_hour, obs_idx, obs_month, obs_qtr, obs_week, 
                            serial_num, stat_md5
                   ))
4

2 に答える 2

1

、stat_md5、MIN(stat_memfree) AS stat_memfree、MIN(stat_md5) AS stat_md5、

stat_md5 は SELECT リストに 2 回あります。1 回は単独で、もう 1 回は MIN() のエイリアスです。3.4.2 は最初のものを使用し、3.7.11 は 2 番目のものを使用している必要があります。

集計フィールドによるグループ化は意味がないため、エラーは正しいです。

2回目のエイリアスを次のように変更するだけAS min_stat_md5で問題なく動作します。いずれにせよ、SELECT で同じ名前の 2 つのフィールドを持つことは悪い考えです。

于 2012-07-30T14:37:57.890 に答える
0

このインライン ビューの括弧は、私にはファンキーに見えます。

       (select * from ( mem_stat NATURAL LEFT OUTER JOIN host ))  

また、IMO、クエリの明確さと読みやすさのために、インライン ビューにエイリアスを割り当てることをお勧めします。

      select Books4Kids.Price
      from
      (
       select authors.name, titles.price
       from authors inner join titles on authors.authorid = titles.authorid
       where titles.category = 'Childrens Literature'
      ) as Books4Kids
于 2012-07-30T18:35:14.013 に答える