各位大侠,本人愚钝,想了很久还是没有办法,望大家帮帮忙
还是先把问题贴出来:有n张资源表,这里举例2张资源表
表Table1:
CREATE TABLE `table1` (
  `id` varchar(255) NOT NULL default '',
  `name` varchar(255) default NULL,
  `address` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
)
其中id为资源号(可能与其他资源表中的id重复),name和address都为资源对应的属性字段表Table2
CREATE TABLE `table2` (
  `id` varchar(255) NOT NULL default '',
  `name` varchar(255) default NULL,
  `telephone` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
)
其中id为资源号(可能与其他资源表中的id重复),name和telephone都为资源对应的属性字段还有其他表和他们类似...新增一个操作历史记录表 Toper_his,来记录他们属性字段的修改操作。CREATE TABLE `toper_his` (
  `id` varchar(255) NOT NULL default '',
  `id_type` varchar(255) NOT NULL default '',
  `oper_type` varchar(255) NOT NULL default '',
  `oper_date` date default NULL,
  PRIMARY KEY  (`id`,`id_type`,`oper_type`)
) 其中id为对应的资源号,id_type为对应的资源类型(也就是说这个修改是在表Table1还是在Table2),oper_type为对应的操作类型(也就是改了表中的name属性,还是改了address属性,还是改了telephone属性等等),oper_date为修改时间,前三个为组合主键,唯一确定一条记录。
现在要写一个查询语句,要Table1中所有资源的name属性的修改记录时间,没有修改记录的则返回null。一开始我是打算这样查的:
select a.id, a.name, b.oper_date from Table1 a, Toper_his b where a.id=b.id(+) and (b.id_type='1' or b.id_type is null) and (b.oper_type='name' or b.oper_type is null);
发现确实可以查出数据来,但后来发现如果历史记录表中有一个资源的name修改记录,但没有address修改记录,则可以查出name的修改记录,查address修改记录时则该资源记录会被直接过滤掉问题就是出在了(b.oper_type='name' or b.oper_type is null) 因为这时的oper_type即不为空,也不为address     但我却不知道怎么改才能正确查出来。。由于现在的电脑上没有安装Oracle环境,所以以上SQL代码都没有经过验证,可能会有错误,还请各位见谅。。

解决方案 »

  1.   

    b.oper_type='name' or b.oper_type is null
    说了半天,最后一段话才是最关键的,可惜不是看很懂,
    你想要把ADDRESS的也过滤出来?加个
    b.oper_type='name' or b.oper_type is null or b.oper_type='address'
      

  2.   

    问题是像address这样的字段有很多 不能这样每个都加啊。。 
    我想要个这样的效果  就是那个历史操作表的组合主键当做一个主键与资源表进行左连接。。 
    像res.id=“his.id”(+)   不知道怎么实现啊。
      

  3.   

    就是因为现在的电脑里没有Oracle和那些脚本,所以才描述了这么多
    不过貌似这样写就解决问题了:where a.id=b.id(+) and '1'=b.id_type(+) and 'name'=b.oper_type(+)