现在有三个表(公司信息表,公司名称变更表,合同表)
表的结构依次为,其中(公司信息表--公司名称变更表有联系,公司名称变更表-合同表有联系)  编号   公司名称
  1      中国石油
  2      中国电信
  编号   外键    变更后的名称
  1       1      中国石化
  2       1      北京石油
  3       1      中国石油石化  编号    公司名称    合同号   外键
  1       中国石化     10004   1
  2       北京石油     10006   2
  3       中国石油石化 10078   3
  4       北京石油     20067   1现在要求的查询结果:
  输入任何一个公司变更名称,我都能找到和这个公司相关的合同,不管是公司变更前还是变更后的,例如:
   输入北京石油或中国石油石化,结果是
  1       中国石化     10004   1
  2       北京石油     10006   2
  3       中国石油石化 10078   3
  4       北京石油     20067   1因为签合同是用的变更后的公司名,但是公司名没有变更前签的合同,也应该能查出来,因为公司地址没有发生变化

解决方案 »

  1.   

    ----创建测试数据
    declare @t1 table(编号 int,公司名称 varchar(20))
    insert @t1
    select   1,      '中国石油' union all
    select   2,      '中国电信'
    declare @t2 table(编号 int,外键 int,变更后的名称 varchar(20))
    insert @t2
    select  1,       1,      '中国石化' union all
    select  2,       1,      '北京石油' union all
    select  3,       1,      '中国石油石化'
    declare @t3 table(编号 int,公司名称 varchar(20),合同号 varchar(10),外键 int)
    insert @t3
    select  1,       '中国石化',     '10004',   1 union all
    select  2,       '北京石油',     '10006',   2 union all
    select  3,       '中国石油石化', '10078',   3 union all
    select  4,       '北京石油',     '20067',   1----查询
    declare @name varchar(20)
    set @name = '北京石油'
    SELECT c.* FROM @t1 as a 
    INNER JOIN @t2 as b on a.编号 = b.外键
    INNER JOIN @t3 as c on b.编号 = c.外键
    WHERE a.公司名称 = @name OR a.编号 = (select 外键 from @t2 where 变更后的名称 = @name)
    ORDER BY c.编号
    /*结果编号        公司名称                 合同号        外键          
    ----------- -------------------- ---------- ----------- 
    1           中国石化                 10004         1
    2           北京石油                 10006         2
    3           中国石油石化             10078         3
    4           北京石油                 20067         1
    */
      

  2.   

    气死我了!!!!
    我把数据写完后,一个输入法切换SQL死机了,郁闷
    我觉得 楼主的合同表的外键是多余的INNER   JOIN   @t3   as   c   on   b.公司名称   =   c.公司名称