Работает ли SELECT DISTINCT с DBL :: CSV в Perl? - PullRequest
4 голосов
/ 21 декабря 2009

Я нашел 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 ]

3 голосов
/ 28 декабря 2009

Привет. Это легко воспроизводимая ошибка. SELECT data_display_mask ОТ test.csv возвращает более 200 строк. SELECT DISTINCT data_display_mask ОТ test.csv возвращает предупреждение и те же 200 строк.

Если я делаю awk, сортирую -u для уникальных (значений строки), я получаю 36 значений, чего я и ожидал.

Конечно, ошибка в коде.

-Kanwar

perl -V Сводка моей конфигурации perl5 (версия 5, версия 10, subversion 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

3 голосов
/ 21 декабря 2009

Обратите внимание, что сообщение о том, что что-то не является разумным,

  1. Только предупреждение. Тем не менее ваш скрипт работает.
  2. Запутанно и бессмысленно: вы не используете никаких агрегатных функций.

Я чувствую ошибку в DBD::CSV или SQL::Statement.

Редактировать: DISTINCT явно разрешено в SQL::Statement

1 голос
/ 14 февраля 2012
my $sth = $dbh->prepare("SELECT DISTINCT $attributeName1, COUNT( $attributeName2) FROM tableName GROUP BY $attributeName1, $attributeName2");

это дало мне: attributeName1 и отдельный счетчик attributeName2

0 голосов
/ 14 февраля 2012

У меня работает. Я получаю 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, выпуск 20 ноября 2009 г. * Правильная обработка DISTINCT в агрегатных функциях

0 голосов
/ 23 февраля 2011

Это пример более общего явления с DBD::CSV, а именно, что он допускает много синтаксиса SQL, для которого значение молча игнорируется.

Я видел случаи SELECT DISTINCT, которые на самом деле отфильтровывают дубликаты, так что случай, который вы упомянули здесь, кажется ошибкой, но я не нашел способа заставить DISTINCT в SELECT COUNT(DISTINCT foo) FROM bar сделать что-либо.

0 голосов
/ 04 января 2010

Я встретил ту же проблему.

Вы можете обойти эту проблему, используя оператор GROUP BY вместо DISTINCT.

Это просто поворот в ожидании разрешения ошибки ...

...