4

我在网上找到了一个 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,排序 -u 为唯一(行的值)我得到 36 个值,这是我所期望的。

当然是代码中的错误。

-坎瓦尔

perl -V 我的perl5(revision 5 version 10 subversion 0)配置总结: Platform: 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

我遇到了同样的问题。

您可以使用GROUP BY语句而不是DISTINCT.

这只是一个等待解决错误的转身......

于 2010-01-04T10:58:55.973 回答
0

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

我已经看到SELECT DISTINCT 实际上过滤掉重复项的情况,所以你在这里提到的情况似乎是一个错误,但我还没有找到一种方法让DISTINCTinSELECT 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 回答