【问题标题】:Does SELECT DISTINCT work with Perl's DBD::CSV?SELECT DISTINCT 是否适用于 Perl 的 DBD::CSV?
【发布时间】:2009-12-21 17:02:35
【问题描述】:

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

【问题讨论】:

  • 你真的应该考虑迁移到 perl5.10.1。它修复了许多在 5.10.0 中不太正确的问题。
  • 有趣。我收到 Perl 5.10.0、DBD::CSV 0.26、SQL::Parser 1.23 和 DBI 1.609 的警告(虽然是工作代码)。听到 perl 本身是罪魁祸首,我会感到惊讶。
  • 我尝试使用 perl v5.8.8 并得到 4 行。

标签: perl select dbi


【解决方案1】:

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

如果我执行 awk,sort -u for unique(行的值)我会得到 36 个值,这是我所期望的。

肯定是代码中的一个错误。

-坎瓦尔

perl -V 我的perl5(revision 5 version 10 subversion 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

【讨论】:

  • 这似乎在 SQL::Statement 的更高版本中得到修复。 1.23 至少有 9 个版本过时,实际上已从 CPAN 中删除。
【解决方案2】:

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

  1. 只是一个警告。您的脚本仍然有效。
  2. 令人困惑且毫无意义:您不使用任何聚合函数。

我在DBD::CSVSQL::Statement 中闻到了一个错误。

编辑: DISTINCTSQL::Statement 中被明确允许

【讨论】:

    【解决方案3】:
    my $sth = $dbh->prepare("SELECT DISTINCT $attributeName1, COUNT( $attributeName2) FROM tableName GROUP BY $attributeName1, $attributeName2");
    

    这给了我:attributeName1 和不同的 attributeName2 计数

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        为我工作。我回来了 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

        【讨论】:

          【解决方案6】:

          我遇到了同样的问题。

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

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

          【讨论】:

          • 您能发表您的“GROUP BY”声明吗?
          猜你喜欢
          • 2013-02-23
          • 1970-01-01
          • 2023-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多