SELECT DISTINCT是否可以与Perl的DBD :: CSV一起使用?

时间:2009-12-21 17:02:35

标签: perl select dbi

我在网上找到了一个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

6 个答案:

答案 0 :(得分:3)

请注意,关于某些不合理的消息是

  1. 只有警告。不过你的脚本仍然可以使用。
  2. 令人困惑且不感性:您不使用任何聚合函数。
  3. 我闻到了DBD::CSVSQL::Statement中的错误。

    编辑: DISTINCT明确允许SQL::Statement

答案 1 :(得分:3)

嗨这是一个容易重现的错误。 SELECT data_display_mask FROM test.csv返回200多行。 SELECT DISTINCT data_display_mask FROM test.csv返回警告消息和相同的200行。

如果我做一个awk,将-u排序为唯一(行的值),我得到36个值,这就是我所期望的。

当然是代码中的错误。

-Kanwar

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 :: Parser 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

答案 2 :(得分:1)

my $sth = $dbh->prepare("SELECT DISTINCT $attributeName1, COUNT( $attributeName2) FROM tableName GROUP BY $attributeName1, $attributeName2");

这给了我:attributeName1和一个非常统计的attributeName2

答案 3 :(得分:0)

我遇到了同样的问题。

您可以使用GROUP BY语句而不是DISTINCT来解决此问题。

这只是等待解决错误的转变......

答案 4 :(得分:0)

这是DBD::CSV更普遍现象的一个例子,即它允许大量的SQL语法,其含义被默默忽略。

我见过SELECT DISTINCT实际过滤掉重复项的情况,所以你在这里提到的情况似乎是一个bug, 但我还没有办法让DISTINCT中的SELECT COUNT(DISTINCT foo) FROM bar做任何事情。

答案 5 :(得分: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