4

Web で SELECT の例を見つけました。スクリプトで試してみると、次のエラー メッセージが表示されます。

Specifying DISTINCT when using aggregate functions isn't reasonable - ignored. at /usr/lib/perl5/site_perl/5.10.0/SQL/Parser.pm line 496.

#!/usr/bin/perl
use warnings;
use strict;
use DBI;

my $dbh = DBI->connect( "DBI:CSV:", undef, undef, { RaiseError => 1, AutoCommit => 1 } );
my $table = 'artikel';

my $array_ref = [   [ 'a_nr', 'a_name', 'a_preis' ],  
            [ 12, 'Oberhemd', 39.80, ],
            [ 22, 'Mantel', 360.00, ],
            [ 11, 'Oberhemd', 44.20, ],
            [ 13, 'Hose', 119.50, ],
        ];
$dbh->do( "CREATE TEMP TABLE $table AS IMPORT(?)", {}, $array_ref );

my $sth = $dbh->prepare( "SELECT DISTINCT a_name FROM $table" );
$sth->execute();
$sth->dump_results();
$dbh->disconnect();

SELECT DISTINCT は DBD::CSV で動作しませんか、それとも私のスクリプトに何か問題がありますか?

編集:出力は

'Oberhemd' 'Mantel' 'Oberhemd' 'Hose' 4 rows

そうあるべきだと思った

'Oberhemd' 'Mantel' 'Hose' 3 rows

インストールされているバージョン:

Perl : 5.010000 (x86_64-linux-thread-multi) OS : linux (2.6.31) DBI : 1.609 DBD::Sponge : 12.010002 DBD::SQLite : 1.25 DBD::Proxy : 0.2004 DBD::Gofer : 0.011565 DBD::File : 0.37 DBD::ExampleP : 12.010007 DBD::DBM : 0.03 DBD::CSV : 0.26

4

6 に答える 6

3

何かが合理的でないというメッセージは、

  1. 警告のみ。それにもかかわらず、スクリプトは機能します。
  2. 紛らわしく無意味です: 集計関数を使用しません。

DBD::CSVまたは のどちらかに虫の匂いがしますSQL::Statement

編集: DISTINCT明示的に許可されていますSQL::Statement

于 2009-12-21T20:03:15.447 に答える
3

こんにちは これは簡単に再現できるバグです。SELECT data_display_mask FROM test.csv は 200 以上の行を返します。SELECT DISTINCT data_display_mask FROM test.csv は、警告メッセージと同じ 200 行を返します。

awk を実行すると、一意の (行の値) に対して sort -u を実行すると、36 個の値が得られます。これは期待どおりです。

確かにコードのバグです。

-カンワル

perl -V 私の perl5 (リビジョン 5 バージョン 10 サブバージョン 0) 構成の概要: プラットフォーム: osname=linux, osvers=2.2.24-6.2.3, archname=i686-linux-thread-multi

DBD::CSV 0.26 SQL::パーサー 1.23 DBI 1.609

例:

集約関数を使用するときに DISTINCT を指定することは合理的ではありません - 無視されます。/opt/perl2exe/perl5/lib/site_perl/5.10.0/SQL/Parser.pm 496 行目。 87060 87060 87060 87060

使用される SQL は SELECT DISTINCT entry_id FROM test.csv です。

于 2009-12-28T14:48:39.520 に答える
1
my $sth = $dbh->prepare("SELECT DISTINCT $attributeName1, COUNT( $attributeName2) FROM tableName GROUP BY $attributeName1, $attributeName2");

これにより、attributeName1とattributeName2の個別のカウントが得られました

于 2012-02-14T15:28:58.900 に答える
0

これは、 のより一般的な現象の例ですDBD::CSV。つまり、意味が暗黙のうちに無視される多くの SQL 構文が許可されます。

実際に重複を除外するケースを見たことがありますので、ここで言及したケースはバグのようですが、 inに何かSELECT DISTINCT をさせる方法は見つかりませんでした.DISTINCTSELECT COUNT(DISTINCT foo) FROM bar

于 2011-02-23T07:26:33.067 に答える
0

私のために働きます。3行戻します。

    $ perl x.pl
'Oberhemd'
'Mantel'
'Hose'
3 rows

perl -MDBI -le 'DBI->installed_versions;'
      Perl            : 5.010001    (i686-linux-gnu-thread-multi)
      OS              : linux   (2.6.24-28-server)
      DBI             : 1.617
      DBD::mysql      : 4.020
      DBD::Sys        : 0.102
      DBD::Sponge     : 12.010002
      DBD::SQLite     : 1.33
      DBD::Proxy      : 0.2004
      DBD::Pg         : 2.17.2
      DBD::Oracle     : 1.38
      DBD::ODBC       : 1.33
      DBD::Multiplex  : 2.014122
      DBD::Gofer      : 0.015057
      DBD::File       : 0.40
      DBD::ExampleP   : 12.014310
      DBD::DBM        : 0.06
      DBD::CSV        : 0.30

追加した:

perl -MSQL::Statement -le 'print $SQL::Statement::VERSION'
1.31

バージョン 1.23、2009 年 11 月 20 日リリース * 集計関数での DISTINCT の正しい処理

于 2012-02-14T16:13:16.173 に答える