用临时表,分两次查询,第一次先不要连接CLASSIFICATION C, wiretype d 两个表。或者彻底写,用临时表和update语句实现外连接。

解决方案 »

  1.   

    Yang_(扬帆破浪) 你说的很对!设计不是很好。
    这个SQL 是从oralce 上 转过来的。 oralce 是支持这种多次连接的。
    除了用临时表,MSSQL就没有其它语法支持这样的查询吗?有个产品要从oralce 迁到 MSSQL 2K , 搞了几天,发现不少在oralce上可以跑的SQL,在MSSQL上有限制。
    :( 也许是我对MSSQL 不甚了解吧。
      

  2.   

    同意楼上的意见,
    SQL太臃肿了.ah.ah.....
      

  3.   

    SELECT /*+index(query)*/ WD.ARTICLECODE,WIRETIME,INTIME,S.DESCRIPTION SOURCENAME,C.DESCRIPTION CLASSNAME, WD.FILELENGTH,TITLE,CONTENTDATA,LASTUSEDBY,LASTUSEDAT,PRIORITY, REMARK,      WA.ALBUM, WT.WIDTH, WT.HEIGHT, WD.FILEPATH + WD.FILENAME FILEPATH,      C.Description Class,d.Description Type,s.description as source,wd.sourcecode,wd.wireclass,wd.caption,wd.articlestatus,wd.filepath ori_filepath,wd.filename,wd.wiredatatype,      wt.byline,wt.bylinetitle,wt.captionwriter,wt.city,wt.copyrightnotice,wt.countryname,wt.keywords,wt.specialinstructions,wt.provincestate,wt.source as photosource,wt.originaltranref,wt.objectname,wt.credit  
    FROM WIREDATA WD left outer join SOURCE S on WD.SOURCECODE = S.SOURCECODE and WD.SOURCECODE = S.SOURCECODE 
    inner join WIREALBUM WA on WD.ARTICLECODE = WA.ARTICLECODE 
    inner join WIRETHUMB WT on WD.ARTICLECODE = WT.ARTICLECODE 
    left outer join WireClassMap wm on WD.SOURCECODE = wm.SOURCECODE AND WD.TYPECODE = WM.TYPECODE AND WD.WIRECLASS = WM.WIRECLASS 
    left outer join CLASSIFICATION C on WM.CLASSCODE = C.CLASSCODE 
    left outer join wiretype d on WM.TypeCode = d.TypeCode  
    WHERE WD.ARTICLECODE IN ('AFP_P0002002091718074455');
      

  4.   

    IronPromises(铁诺) ,我明白了,原来是我的写法有问题,你这样写就好了。我从oralce 转过来时,只是把 (+) 改成 *= ,原来是不行的。
    MSSQL的语法器分析也太差了。
      

  5.   

    MS已经公开的宣称*=和=*的传统写法在今后的版本中有可能不再被支持。
    但left outer join的SQL-99标准的写法会一直支持下去。至于外连接,SQL Server要比Oracle灵活而且规范。
    Oracle不能以两个或两个以上的表做为主表,但是SQL Server可以。
    而且SQL Server有全连接,但是Oracle没有,在Oracle中如果想实现全连接的功能的话,只有先左连再右连,最后再union!BTW:Oracle自创出来的(+)做为外连接符号,一点都不和标准同步。
      

  6.   

    看来
    Oracle还有不少东东和SQL SERVER的不同..学习中……