超难数据库多表联接问题,高手进来(100)

A

aynes

Unregistered / Unconfirmed
GUEST, unregistred user!
现在有表入库表 B品名 入库数量 11  1   11  2   11  3   22  4   22  5   出库表 C品名 出库数量 11  10   11  11   33  1233  13 33  14 每个表之间的联系是 品名想要得到的结果是品名 入库量 出库量 11  1   10   11  2   11   11  3    22  4   22  5   33      12 33      1333      14出库与入库不是一一对应的关系,只要能按顺序罗列出来就好,因为程序本身数据库比较复杂,用stringgrid一行行写入数据比较麻烦,所以想请教一下,能不能用select语名来实现我现在的语句是select b.品名,b.入库量,c.出库量 from b left join c on b.品名=c.品名 出来的结果是品名 入库量 出库量 11  1   10   11  1   11   11  2   10   11  2   11   11  3   10   11  3   11   22  4   22  5   33      12 33      1333      14与我想要的不符合,请教各位大神,这个问题该如何解决。
 
你不要用select来做 ,应该用程序语言写,让其控制数据库,这样最好
 
select应该做不了吧?你在AdoDataSet里面做吧。LockType设置为ltBatchOptimistic,然后在该DataSet里面做插入。只要不批量保存,就不会改到数据库里,只是界面显示。
 
你这2张入库、出库表都是明细表,那么你想要得到的结果品名 入库量 出库量 11  1   10   11  2   11   11  3    22  4   22  5   33      12 33      1333      14有什么意义呢?我觉得应该是需要汇总后的结果:品名 入库量 出库量 11  6   21 22  9 0   33  0   39如果是这样,就没有什么难度了,否则你的语句一定是多对多(因为你把明细表进行了关联),那样是不对的,而且没有意义,就拿你要的结果来说吧:品名 入库量 出库量 11  1   10   11  2   11 你怎么确定品名 11、入库量为 1 的记录的 出库量 就一定是 10 呢?为什么不可以是 11呢?所以我说这种明细结果没有意义,应该是 11 3 21才有意义。如果你硬要得到你想要的结果,用代码即可。
 
可以的,但效率很低,以下SQL你可以试一下,如果可以,你再关联A表Select B2.品名 AS 品名B, B2.入库数量, B2.入库时间, C2.品名 AS 品名B, C2.出库数量, C2.出库时间FROM (select 品名, 入库数量, 入库时间, (Select count(*) as X From B AS Z where Z.品名=B.品名 AND Z.入库时间<=B.入库时间)as Index from B) B2 FULL JOIN (select 品名, 出库数量, 出库时间, (Select count(*) as X From C AS Z where Z.品名=C.品名 AND Z.出库时间<=C.出库时间) as Index from C) C2 ON B2.品名 = C2.品名 and B2.Index=C2.Index----------------Access里面Full join 好像不可以,参考http://access911.net/fixhtm/71FAB21E14DCEFF3.htm?tt=通过这个实现B2,C2的全连接,然后将结果和A关联
 
正解:select应该做不了吧?你在AdoDataSet里面做吧。LockType设置为ltBatchOptimistic,然后在该DataSet里面做插入。只要不批量保存,就不会改到数据库里,只是界面显示。容易、简单、高效
 
告诉大家:一切都可以用 SQL 语句实现,只是难度问题。
 
只是楼主的条件可能没有完备,应该最好有个与时间有关的字段
 

Similar threads

S
回复
0
查看
745
SUNSTONE的Delphi笔记
S
S
回复
0
查看
692
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
顶部