我做的系统大概是这样一个结构.主表 A
子表(B,C,D等等很多个)比如有港口表.银行表,船期表等等,大概有20多个这样的基本表,这些子表的设计结构基本上都是
code , codename, detail 这样的形式,他们通过各自code与A表关联.
于是我查询时候用了这样的形式
select a.*,getnamebyCoce(a.portcode),getnamebyCoce(a.VEsselcode),.......from a where A.DATE BETWEEN....AND ....这样的形式.
其中 getnamebyCoce是个自定义函数,用来从B.C,D表中抓详细信息(这样的表设计应该还是合理的吧)但是发现函数效率太慢了呀.有个10个8个这样的函数时间一厂速度真是慢呀.如果用join的话这表也太多了吧,估计一局也写不出来吧,况且我A表里面比如港口的话有起运港,目的港这样不同的港口,但是都是早PORT表里面取的,但是在A表里面就分别放了几个列,这样也使的join很难实现哦,请问有什么好的实现吗?

解决方案 »

  1.   

    没啥说的,用join,除了句子可能长点,没什么难实现
      

  2.   

    函数没办法优化, 直接拿出来做join吧
      

  3.   

    如果有几十个表要JOIN, 说明你应该考虑调整表结构设计, 比如建立一些中间表预先join, 或者使用索引视图这类能缓存数据的
      

  4.   

    函数很简单的:
    CREATE FUNCTION dbo.getPort
    (
    @code varchar(20)
    )
    RETURNS varchar(30)
    AS
    BEGIN
    declare @Port varchar(30)
    select @Port=Portname from port where port_code=@code
    RETURN isnull(@Port,'')
    END
    关键是用连接有2个问题,一个是太多了关联,可能有几十个表吧,是否可以用桥梁表解决下呀!
    2就是比如我这个港口可能有起运港,目的港的code,都防在A表.这样连接一句还是实现不了.
      

  5.   

    一句怎么实现不了?
    select t1.portname as '起运港', t2.portname as '目的港' 
    from a 
    join port t1 on (a.起运港_code = t1.port_code )
    join port t2 on (a.目的港_code = t2.port_code )