大家说的 sqlite 挺好,为啥不用? 2010/11/17 ZHANG Jiaqiang A <[email protected]>
> 多谢 cnhack TNT。我到cpan上面给DBD CSV开了个ticket确认一下。 > > > 另外,我之所以用csv就是觉得比较方便,原始内容在xml里面,用perl解析出couple和people的内容后直接放在CSV文件里,就可以用SQL访问其中的数据了。也不用安装任何数据库软件。 > > 不知道除此之外,有没有更简易高效的类似解决方案。 > > 内存数据库是不是都需要安装相应的软件才可以?是否有推荐的,免费的 ? > > > ------------------------------ > *From:* [email protected] [mailto:[email protected]] *On > Behalf Of *cnhack TNT > *Sent:* 2010年11月17日 10:45 > > *To:* [email protected] > *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 <[email protected]> > >> 我想一条语句把老公和老婆的年龄一起读出来,我的想像中,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:* [email protected] [mailto:[email protected]] *On >> Behalf Of *cnhack TNT >> *Sent:* 2010年11月17日 9:41 >> *To:* [email protected] >> *Subject:* Re: [PerlChina] CSV的SQL语句中一张表不能出现两次 >> >> 为啥要 “people h, people w” ? >> >> 2010/11/17 ZHANG Jiaqiang A <[email protected]> >> >>> 大家好, >>> >>> 有一张表,我需要多次关联,设了不同的别名,但是执行SQL的时候报错,大家有用过DBD-CSV的高手,帮我看看这是DBDCSV的限制还是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 讨论组”论坛。 >>> 要向此网上论坛发帖,请发送电子邮件至 [email protected]。 >>> 要取消订阅此网上论坛,请发送电子邮件至 >>> [email protected]<perlchina%[email protected]> >>> 。 >>> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。 >>> >> >> -- >> 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。 >> 要向此网上论坛发帖,请发送电子邮件至 [email protected]。 >> 要取消订阅此网上论坛,请发送电子邮件至 >> [email protected]<perlchina%[email protected]> >> 。 >> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。 >> >> -- >> 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。 >> 要向此网上论坛发帖,请发送电子邮件至 [email protected]。 >> 要取消订阅此网上论坛,请发送电子邮件至 >> [email protected]<perlchina%[email protected]> >> 。 >> 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。 >> > > -- > 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。 > 要向此网上论坛发帖,请发送电子邮件至 [email protected]。 > 要取消订阅此网上论坛,请发送电子邮件至 > [email protected]<perlchina%[email protected]> > 。 > 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。 > > -- > 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。 > 要向此网上论坛发帖,请发送电子邮件至 [email protected]。 > 要取消订阅此网上论坛,请发送电子邮件至 > [email protected]<perlchina%[email protected]> > 。 > 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。 > -- 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。 要向此网上论坛发帖,请发送电子邮件至 [email protected]。 要取消订阅此网上论坛,请发送电子邮件至 [email protected]。 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
