2010年11月17日星期三

RE: [PerlChina] CSV的SQL语句中一张表不能出现两次

之前我完全没用过SQLite。刚才试了一下,感觉挺好。
 
另外,对于DBD::CSV 的一张表多别名报错的问题 SQLite可以处理的很好。
 
感谢各位的建议。


From: perlchina@googlegroups.com [mailto:perlchina@googlegroups.com] On Behalf Of cnhack TNT
Sent: 2010年11月17日 18:01
To: perlchina@googlegroups.com
Subject: Re: [PerlChina] CSV的SQL语句中一张表不能出现两次

大家说的 sqlite 挺好,为啥不用?

2010/11/17 ZHANG Jiaqiang A <Jiaqiang.a.Zhang@alcatel-sbell.com.cn>
多谢 cnhack TNT。我到cpan上面给DBD CSV开了个ticket确认一下。
 
另外,我之所以用csv就是觉得比较方便,原始内容在xml里面,用perl解析出couple和people的内容后直接放在CSV文件里,就可以用SQL访问其中的数据了。也不用安装任何数据库软件。
 
不知道除此之外,有没有更简易高效的类似解决方案。
 
内存数据库是不是都需要安装相应的软件才可以?是否有推荐的,免费的 ?
 
 

From: perlchina@googlegroups.com [mailto:perlchina@googlegroups.com] On Behalf Of cnhack TNT
Sent: 2010年11月17日 10:45

To: perlchina@googlegroups.com
Subject: Re: [PerlChina] CSV的SQL语句中一张表不能出现两次

通过表内自连是可以的:

SELECT c.husband, 
       p1.age, 
       c.wife, 
       p2.age 
FROM   couple c, 
       people p1, 
       people p2 
WHERE  c.husband = p1.name 
       AND c.wife = p2.name; 

但是 DBD::CSV 对自连似乎支持不好,如果你复制一份 people.csv 为 people2.csv, 然后改SQL语句为:

SELECT c.husband, 
       p1.age, 
       c.wife, 
       p2.age 
FROM   couple c, 
       people p1, 
       people2 p2 
WHERE  c.husband = p1.name 
       AND c.wife = p2.name 

也是可以的。


2010/11/17 ZHANG Jiaqiang A <Jiaqiang.a.Zhang@alcatel-sbell.com.cn>
我想一条语句把老公和老婆的年龄一起读出来,我的想像中,SQL的输出应该如下:
 
c.husband  |h.age      |c.wife     |w.age      |
================================================
James      |30         |Mary       |22         |
Roger      |24         |Lily       |26         |
================================================
 
下面是可用的测试代码:(附件里面有测试文件,放到和脚本一起的目录应该就可以用)
 
#!/usr/bin/perl -w
 
use strict;
 
use DBI;
 
my $dbh = DBI->connect ("dbi:CSV:", "", "", {
            f_ext    => ".csv",
            csv_null => 1,
            FetchHashKeyName => 'NAME_lc',
        });

my $query = "select c.husband,h.age,c.wife,w.age from couple c, people h, people w where c.husband = h.name and c.wife = w.name";
#my $query = "select c.husband,h.age from couple c, people h where c.husband = h.name ";
my $sth   = $dbh->prepare ($query);
$sth->execute ();
 
while (my $row = $sth->fetchrow_hashref) {
    foreach my $col ( keys %$row ) {
        print $col,"=",$row->{$col},"\t" if defined $row->{$col};
    }
    print "done\n\n";
}
$sth->finish ();


From: perlchina@googlegroups.com [mailto:perlchina@googlegroups.com] On Behalf Of cnhack TNT
Sent: 2010年11月17日 9:41
To: perlchina@googlegroups.com
Subject: Re: [PerlChina] CSV的SQL语句中一张表不能出现两次

为啥要 "people h, people w" ?

2010/11/17 ZHANG Jiaqiang A <Jiaqiang.a.Zhang@alcatel-sbell.com.cn>
大家好,
 
有一张表,我需要多次关联,设了不同的别名,但是执行SQL的时候报错,大家有用过DBD-CSV的高手,帮我看看这是DBD CSV的限制还是SQL写的不对
 
SQL语句:
select c.husband,h.age,c.wife,w.age from couple c, people h, people w where c.husband = h.name and c.wife = w.name;
 
报错信息:
DBD::CSV::st execute failed: Error 2012 while reading file D:\Perl\people.csv: E
OF - End of data in parsing input stream at C:/strawberry/perl/site/lib/SQL/Stat
ement.pm line 813
 [for Statement "select c.husband,h.age,c.wife,w.age from couple c, people h, pe
ople w where c.husband = h.name and c.wife = w.name"] at csv.pl line 99.
 
以下SQL语句都可以正常执行:
 
select * from couple;

husband    |wife       |
========================
James      |Mary       |
Roger      |Lily       |
========================
Return 2 columns and 2 lines
 
select * from people;
 
name       |age        |
========================
Mary       |22         |
Lily       |26         |
Roger      |24         |
James      |30         |
========================
Return 2 columns and 4 lines
 
select c.husband,h.age from couple c, people h  where c.husband = h.name;

c.husband  |h.age      |
========================
James      |30         |
Roger      |24         |
========================
Return 2 columns and 2 lines
 
select c.wife,w.age from couple c, people w where c.wife = w.name;
 
c.wife     |w.age      |
========================
Mary       |22         |
Lily       |26         |
========================
Return 2 columns and 2 lines
 
祝好
家强

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

[PerlChina] 请 教t kx线 程

仿照人家的源码

#!/usr/bin/perl -w
use strict;
use warnings;
use threads;
use threads::Shared;
use Tkx;

my $child_finished_flag: shared = 0;
my $child_request_flag: shared = 0;

my $ChildThread = threads->create( \&child_thread );
$ChildThread->detach();

my $mw = Tkx::widget->new(".");
$mw->g_wm_title("4 Test");

my $container = $mw->new_ttk__frame;
my $frame = $container->new_ttk__frame();

my $testt = $frame->new_ttk__entry(-textvariable => \my $test);
my $ok = $frame->new_ttk__button(-text => "Test...", -command =>
\&process);
$container->g_grid(-column => 0, -row => 0);
$frame->g_grid(-column => 0, -row => 0, -sticky => "w");

$testt->g_grid(-column => 0, -row => 0);
$ok->g_grid(-column => 0, -row => 1);

Tkx::MainLoop();

sub process {
$child_request_flag= 1;
&check_status_1;
}
#
sub check_status_1 {
Tkx::after(500, sub {
if ($child_finished_flag== 1) {
$child_finished_flag = 0;
$child_request_flag = 0;
print "child_request finished\n";
}
else {
&check_status_2;
print "child_request processing\n";
}
});
}
#
sub check_status_2 {
Tkx::after(500, sub {
&check_status_1;
});
}
#
sub child_thread {
while (1) {
sleep 2;
if ($child_request_flag== 1) {
print "begin child_request\n";
&test;
$child_finished_flag= 1;
}else {
print "waiting for child_request\n";
}
}
}

sub test {
$test= $testt->get();
print "test is: $test\n";
}

在entry中输入任意字符
点击command
Thread 1 terminated abnormally: Can't call method "get" on an
undefined value at demo.pl line 69.
子线程中为何没法get?
在tk的那个线程就算是get了获得的值 shared后 貌似也无法传递过来?
一头雾水。。。
谢谢

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] CSV的SQL语句中一张表不能出现两次

大家说的 sqlite 挺好,为啥不用?

2010/11/17 ZHANG Jiaqiang A <Jiaqiang.a.Zhang@alcatel-sbell.com.cn>
多谢 cnhack TNT。我到cpan上面给DBD CSV开了个ticket确认一下。
 
另外,我之所以用csv就是觉得比较方便,原始内容在xml里面,用perl解析出couple和people的内容后直接放在CSV文件里,就可以用SQL访问其中的数据了。也不用安装任何数据库软件。
 
不知道除此之外,有没有更简易高效的类似解决方案。
 
内存数据库是不是都需要安装相应的软件才可以?是否有推荐的,免费的 ?
 
 

From: perlchina@googlegroups.com [mailto:perlchina@googlegroups.com] On Behalf Of cnhack TNT
Sent: 2010年11月17日 10:45

To: perlchina@googlegroups.com
Subject: Re: [PerlChina] CSV的SQL语句中一张表不能出现两次

通过表内自连是可以的:

SELECT c.husband, 
       p1.age, 
       c.wife, 
       p2.age 
FROM   couple c, 
       people p1, 
       people p2 
WHERE  c.husband = p1.name 
       AND c.wife = p2.name; 

但是 DBD::CSV 对自连似乎支持不好,如果你复制一份 people.csv 为 people2.csv, 然后改SQL语句为:

SELECT c.husband, 
       p1.age, 
       c.wife, 
       p2.age 
FROM   couple c, 
       people p1, 
       people2 p2 
WHERE  c.husband = p1.name 
       AND c.wife = p2.name 

也是可以的。


2010/11/17 ZHANG Jiaqiang A <Jiaqiang.a.Zhang@alcatel-sbell.com.cn>
我想一条语句把老公和老婆的年龄一起读出来,我的想像中,SQL的输出应该如下:
 
c.husband  |h.age      |c.wife     |w.age      |
================================================
James      |30         |Mary       |22         |
Roger      |24         |Lily       |26         |
================================================
 
下面是可用的测试代码:(附件里面有测试文件,放到和脚本一起的目录应该就可以用)
 
#!/usr/bin/perl -w
 
use strict;
 
use DBI;
 
my $dbh = DBI->connect ("dbi:CSV:", "", "", {
            f_ext    => ".csv",
            csv_null => 1,
            FetchHashKeyName => 'NAME_lc',
        });

my $query = "select c.husband,h.age,c.wife,w.age from couple c, people h, people w where c.husband = h.name and c.wife = w.name";
#my $query = "select c.husband,h.age from couple c, people h where c.husband = h.name ";
my $sth   = $dbh->prepare ($query);
$sth->execute ();
 
while (my $row = $sth->fetchrow_hashref) {
    foreach my $col ( keys %$row ) {
        print $col,"=",$row->{$col},"\t" if defined $row->{$col};
    }
    print "done\n\n";
}
$sth->finish ();


From: perlchina@googlegroups.com [mailto:perlchina@googlegroups.com] On Behalf Of cnhack TNT
Sent: 2010年11月17日 9:41
To: perlchina@googlegroups.com
Subject: Re: [PerlChina] CSV的SQL语句中一张表不能出现两次

为啥要 “people h, people w” ?

2010/11/17 ZHANG Jiaqiang A <Jiaqiang.a.Zhang@alcatel-sbell.com.cn>
大家好,
 
有一张表,我需要多次关联,设了不同的别名,但是执行SQL的时候报错,大家有用过DBD-CSV的高手,帮我看看这是DBD CSV的限制还是SQL写的不对
 
SQL语句:
select c.husband,h.age,c.wife,w.age from couple c, people h, people w where c.husband = h.name and c.wife = w.name;
 
报错信息:
DBD::CSV::st execute failed: Error 2012 while reading file D:\Perl\people.csv: E
OF - End of data in parsing input stream at C:/strawberry/perl/site/lib/SQL/Stat
ement.pm line 813
 [for Statement "select c.husband,h.age,c.wife,w.age from couple c, people h, pe
ople w where c.husband = h.name and c.wife = w.name"] at csv.pl line 99.
 
以下SQL语句都可以正常执行:
 
select * from couple;

husband    |wife       |
========================
James      |Mary       |
Roger      |Lily       |
========================
Return 2 columns and 2 lines
 
select * from people;
 
name       |age        |
========================
Mary       |22         |
Lily       |26         |
Roger      |24         |
James      |30         |
========================
Return 2 columns and 4 lines
 
select c.husband,h.age from couple c, people h  where c.husband = h.name;

c.husband  |h.age      |
========================
James      |30         |
Roger      |24         |
========================
Return 2 columns and 2 lines
 
select c.wife,w.age from couple c, people w where c.wife = w.name;
 
c.wife     |w.age      |
========================
Mary       |22         |
Lily       |26         |
========================
Return 2 columns and 2 lines
 
祝好
家强

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

2010年11月16日星期二

Re: [PerlChina] CSV的SQL语句中一张表不能出现两次

为何不用SQLite?

/*
E-Mail: i@lxl.cn
QQ: 28888888
Mobile: 13501281365 / 18611751162
*/

On 17 Nov, 2010, at 13:18, "ZHANG Jiaqiang A" <Jiaqiang.a.Zhang@alcatel-sbell.com.cn> wrote:

多谢 cnhack TNT。我到cpan上面给DBD CSV开了个ticket确认一下。
 
另外,我之所以用csv就是觉得比较方便,原始内容在xml里面,用perl解析出couple和people的内容后直接放在CSV文件里,就可以用SQL访问其中的数据了。也不用安装任何数据库软件。
 
不知道除此之外,有没有更简易高效的类似解决方案。
 
内存数据库是不是都需要安装相应的软件才可以?是否有推荐的,免费的 ?
 
 

From: perlchina@googlegroups.com [mailto:perlchina@googlegroups.com] On Behalf Of cnhack TNT
Sent: 2010年11月17日 10:45
To: perlchina@googlegroups.com
Subject: Re: [PerlChina] CSV的SQL语句中一张表不能出现两次

通过表内自连是可以的:

SELECT c.husband, 
       p1.age, 
       c.wife, 
       p2.age 
FROM   couple c, 
       people p1, 
       people p2 
WHERE  c.husband = p1.name 
       AND c.wife = p2.name; 

但是 DBD::CSV 对自连似乎支持不好,如果你复制一份 people.csv 为 people2.csv, 然后改SQL语句为:

SELECT c.husband, 
       p1.age, 
       c.wife, 
       p2.age 
FROM   couple c, 
       people p1, 
       people2 p2 
WHERE  c.husband = p1.name 
       AND c.wife = p2.name 

也是可以的。


2010/11/17 ZHANG Jiaqiang A <Jiaqiang.a.Zhang@alcatel-sbell.com.cn>
我想一条语句把老公和老婆的年龄一起读出来,我的想像中,SQL的输出应该如下:
 
c.husband  |h.age      |c.wife     |w.age      |
================================================
James      |30         |Mary       |22         |
Roger      |24         |Lily       |26         |
================================================
 
下面是可用的测试代码:(附件里面有测试文件,放到和脚本一起的目录应该就可以用)
 
#!/usr/bin/perl -w
 
use strict;
 
use DBI;
 
my $dbh = DBI->connect ("dbi:CSV:", "", "", {
            f_ext    => ".csv",
            csv_null => 1,
            FetchHashKeyName => 'NAME_lc',
        });

my $query = "select c.husband,h.age,c.wife,w.age from couple c, people h, people w where c.husband = h.name and c.wife = w.name";
#my $query = "select c.husband,h.age from couple c, people h where c.husband = h.name ";
my $sth   = $dbh->prepare ($query);
$sth->execute ();
 
while (my $row = $sth->fetchrow_hashref) {
    foreach my $col ( keys %$row ) {
        print $col,"=",$row->{$col},"\t" if defined $row->{$col};
    }
    print "done\n\n";
}
$sth->finish ();


From: perlchina@googlegroups.com [mailto:perlchina@googlegroups.com] On Behalf Of cnhack TNT
Sent: 2010年11月17日 9:41
To: perlchina@googlegroups.com
Subject: Re: [PerlChina] CSV的SQL语句中一张表不能出现两次

为啥要 “people h, people w” ?

2010/11/17 ZHANG Jiaqiang A <Jiaqiang.a.Zhang@alcatel-sbell.com.cn>
大家好,
 
有一张表,我需要多次关联,设了不同的别名,但是执行SQL的时候报错,大家有用过DBD-CSV的高手,帮我看看这是DBD CSV的限制还是SQL写的不对
 
SQL语句:
select c.husband,h.age,c.wife,w.age from couple c, people h, people w where c.husband = h.name and c.wife = w.name;
 
报错信息:
DBD::CSV::st execute failed: Error 2012 while reading file D:\Perl\people.csv: E
OF - End of data in parsing input stream at C:/strawberry/perl/site/lib/SQL/Stat
ement.pm line 813
 [for Statement "select c.husband,h.age,c.wife,w.age from couple c, people h, pe
ople w where c.husband = h.name and c.wife = w.name"] at csv.pl line 99.
 
以下SQL语句都可以正常执行:
 
select * from couple;

husband    |wife       |
========================
James      |Mary       |
Roger      |Lily       |
========================
Return 2 columns and 2 lines
 
select * from people;
 
name       |age        |
========================
Mary       |22         |
Lily       |26         |
Roger      |24         |
James      |30         |
========================
Return 2 columns and 4 lines
 
select c.husband,h.age from couple c, people h  where c.husband = h.name;

c.husband  |h.age      |
========================
James      |30         |
Roger      |24         |
========================
Return 2 columns and 2 lines
 
select c.wife,w.age from couple c, people w where c.wife = w.name;
 
c.wife     |w.age      |
========================
Mary       |22         |
Lily       |26         |
========================
Return 2 columns and 2 lines
 
祝好
家强

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

Re: [PerlChina] CSV的SQL语句中一张表不能出现两次

DBD::SQLite

On 2010/11/17 13:17, ZHANG Jiaqiang A wrote:
多谢 cnhack TNT。我到cpan上面给DBD CSV开了个ticket确认一下。
 
另外,我之所以用csv就是觉得比较方便,原始内容在xml里 面,用perl解析出couple和people的内容后直接放在CSV文件里,就可以用SQL访问其中的数据了。也不 用安装任何数据库软件。
 
不知道除此之外,有没有更简易高效的类似解决方案。
 
内存数据库是不是都需要安装相应的软件才可以?是否有推荐的, 免费的 ?
 
 

From: perlchina@googlegroups.com [mailto:perlchina@googlegroups.com] On Behalf Of cnhack TNT
Sent: 2010年11月17日 10:45
To: perlchina@googlegroups.com
Subject: Re: [PerlChina] CSV的SQL语句中一张表不能出现两次

通过表内自连是可以的:

SELECT c.husband, 
       p1.age, 
       c.wife, 
       p2.age 
FROM   couple c, 
       people p1, 
       people p2 
WHERE  c.husband = p1.name 
       AND c.wife = p2.name; 

但是 DBD::CSV 对自连似乎支持不好,如果你复制一份 people.csv 为 people2.csv, 然后改SQL语句为:

SELECT c.husband, 
       p1.age, 
       c.wife, 
       p2.age 
FROM   couple c, 
       people p1, 
       people2 p2 
WHERE  c.husband = p1.name 
       AND c.wife = p2.name 

也是可以的。


2010/11/17 ZHANG Jiaqiang A <Jiaqiang.a.Zhang@alcatel-sbell.com.cn>
我想一条语句把老公和老婆的年龄一起读出来,我的想 像中,SQL的输出应该如下:
 
c.husband  |h.age      |c.wife     |w.age      |
================================================
James      |30         |Mary       |22         |
Roger      |24         |Lily       |26         |
================================================
 
下面是可用的测试代码:(附件里面有测试文件,放到 和脚本一起的目录应该就可以用)
 
#!/usr/bin/perl -w
 
use strict;
 
use DBI;
 
my $dbh = DBI->connect ("dbi:CSV:", "", "", {
            f_ext    => ".csv",
            csv_null => 1,
            FetchHashKeyName => 'NAME_lc',
        });

my $query = "select c.husband,h.age,c.wife,w.age from couple c, people h, people w where c.husband = h.name and c.wife = w.name";
#my $query = "select c.husband,h.age from couple c, people h where c.husband = h.name ";
my $sth   = $dbh->prepare ($query);
$sth->execute ();
 
while (my $row = $sth->fetchrow_hashref) {
    foreach my $col ( keys %$row ) {
        print $col,"=",$row->{$col},"\t" if defined $row->{$col};
    }
    print "done\n\n";
}
$sth->finish ();


From: perlchina@googlegroups.com [mailto:perlchina@googlegroups.com] On Behalf Of cnhack TNT
Sent: 2010年11月17日 9:41
To: perlchina@googlegroups.com
Subject: Re: [PerlChina] CSV的SQL语句中一张表不能出现两次

为啥要 "people h, people w" ?

2010/11/17 ZHANG Jiaqiang A <Jiaqiang.a.Zhang@alcatel-sbell.com.cn>
大家好,
 
有一张 表,我需要多次关联,设了不同的别名,但是执行SQL的时候报错,大家有用过DBD-CSV 的高手,帮我看看这是DBD CSV的限制还是SQL写的不对
 
SQL 语句:
select c.husband,h.age,c.wife,w.age from couple c, people h, people w where c.husband = h.name and c.wife = w.name;
 
报 错信息:
DBD::CSV::st execute failed: Error 2012 while reading file D:\Perl\people.csv: E
OF - End of data in parsing input stream at C:/strawberry/perl/site/lib/SQL/Stat
ement.pm line 813
 [for Statement "select c.husband,h.age,c.wife,w.age from couple c, people h, pe
ople w where c.husband = h.name and c.wife = w.name"] at csv.pl line 99.
 
以 下SQL语句都可以正常执行:
 
select * from couple;

husband    |wife       |
========================
James      |Mary       |
Roger      |Lily       |
========================
Return 2 columns and 2 lines
 
select * from people;
 
name       |age        |
========================
Mary       |22         |
Lily       |26         |
Roger      |24         |
James      |30         |
========================
Return 2 columns and 4 lines
 
select c.husband,h.age from couple c, people h  where c.husband = h.name;

c.husband  |h.age      |
========================
James      |30         |
Roger      |24         |
========================
Return 2 columns and 2 lines
 
select c.wife,w.age from couple c, people w where c.wife = w.name;
 
c.wife     |w.age      |
========================
Mary       |22         |
Lily       |26         |
========================
Return 2 columns and 2 lines
 
祝好
家强
--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。


--  Fayland Lam // http://www.fayland.org/

RE: [PerlChina] CSV的SQL语句中一张表不能出现两次

多谢 cnhack TNT。我到cpan上面给DBD CSV开了个ticket确认一下。
 
另外,我之所以用csv就是觉得比较方便,原始内容在xml里面,用perl解析出couple和people的内容后直接放在CSV文件里,就可以用SQL访问其中的数据了。也不用安装任何数据库软件。
 
不知道除此之外,有没有更简易高效的类似解决方案。
 
内存数据库是不是都需要安装相应的软件才可以?是否有推荐的,免费的 ?
 
 

From: perlchina@googlegroups.com [mailto:perlchina@googlegroups.com] On Behalf Of cnhack TNT
Sent: 2010年11月17日 10:45
To: perlchina@googlegroups.com
Subject: Re: [PerlChina] CSV的SQL语句中一张表不能出现两次

通过表内自连是可以的:

SELECT c.husband, 
       p1.age, 
       c.wife, 
       p2.age 
FROM   couple c, 
       people p1, 
       people p2 
WHERE  c.husband = p1.name 
       AND c.wife = p2.name; 

但是 DBD::CSV 对自连似乎支持不好,如果你复制一份 people.csv 为 people2.csv, 然后改SQL语句为:

SELECT c.husband, 
       p1.age, 
       c.wife, 
       p2.age 
FROM   couple c, 
       people p1, 
       people2 p2 
WHERE  c.husband = p1.name 
       AND c.wife = p2.name 

也是可以的。


2010/11/17 ZHANG Jiaqiang A <Jiaqiang.a.Zhang@alcatel-sbell.com.cn>
我想一条语句把老公和老婆的年龄一起读出来,我的想像中,SQL的输出应该如下:
 
c.husband  |h.age      |c.wife     |w.age      |
================================================
James      |30         |Mary       |22         |
Roger      |24         |Lily       |26         |
================================================
 
下面是可用的测试代码:(附件里面有测试文件,放到和脚本一起的目录应该就可以用)
 
#!/usr/bin/perl -w
 
use strict;
 
use DBI;
 
my $dbh = DBI->connect ("dbi:CSV:", "", "", {
            f_ext    => ".csv",
            csv_null => 1,
            FetchHashKeyName => 'NAME_lc',
        });

my $query = "select c.husband,h.age,c.wife,w.age from couple c, people h, people w where c.husband = h.name and c.wife = w.name";
#my $query = "select c.husband,h.age from couple c, people h where c.husband = h.name ";
my $sth   = $dbh->prepare ($query);
$sth->execute ();
 
while (my $row = $sth->fetchrow_hashref) {
    foreach my $col ( keys %$row ) {
        print $col,"=",$row->{$col},"\t" if defined $row->{$col};
    }
    print "done\n\n";
}
$sth->finish ();


From: perlchina@googlegroups.com [mailto:perlchina@googlegroups.com] On Behalf Of cnhack TNT
Sent: 2010年11月17日 9:41
To: perlchina@googlegroups.com
Subject: Re: [PerlChina] CSV的SQL语句中一张表不能出现两次

为啥要 "people h, people w" ?

2010/11/17 ZHANG Jiaqiang A <Jiaqiang.a.Zhang@alcatel-sbell.com.cn>
大家好,
 
有一张表,我需要多次关联,设了不同的别名,但是执行SQL的时候报错,大家有用过DBD-CSV的高手,帮我看看这是DBD CSV的限制还是SQL写的不对
 
SQL语句:
select c.husband,h.age,c.wife,w.age from couple c, people h, people w where c.husband = h.name and c.wife = w.name;
 
报错信息:
DBD::CSV::st execute failed: Error 2012 while reading file D:\Perl\people.csv: E
OF - End of data in parsing input stream at C:/strawberry/perl/site/lib/SQL/Stat
ement.pm line 813
 [for Statement "select c.husband,h.age,c.wife,w.age from couple c, people h, pe
ople w where c.husband = h.name and c.wife = w.name"] at csv.pl line 99.
 
以下SQL语句都可以正常执行:
 
select * from couple;

husband    |wife       |
========================
James      |Mary       |
Roger      |Lily       |
========================
Return 2 columns and 2 lines
 
select * from people;
 
name       |age        |
========================
Mary       |22         |
Lily       |26         |
Roger      |24         |
James      |30         |
========================
Return 2 columns and 4 lines
 
select c.husband,h.age from couple c, people h  where c.husband = h.name;

c.husband  |h.age      |
========================
James      |30         |
Roger      |24         |
========================
Return 2 columns and 2 lines
 
select c.wife,w.age from couple c, people w where c.wife = w.name;
 
c.wife     |w.age      |
========================
Mary       |22         |
Lily       |26         |
========================
Return 2 columns and 2 lines
 
祝好
家强

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

--
您收到此邮件是因为您订阅了 Google 网上论坛的"PerlChina Mongers 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com。
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com。
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。