解决方案 »

  1.   

    你既然测试了A和E链接为什么不去看下a和b的?
      

  2.   

    a和b用如下SQL执行,记录数是4253PCS,
     SELECT B.厂内不良数量+B.厂外不良数量 不良数量,B.不良分类  总不良数
    FROM Qcountsum A LEFT JOIN 
    ( SELECT gb91,gb92 厂内不良数量,gb94 厂外不良数量,gb02 工序名称,
     CASE WHEN  gb02 like '%外观%' then '外观不良' ELSE '电气不良' END AS 不良分类    
     FROM Qcountb WHERE gb51 BETWEEN  '2014-06-01'  and  '2014-06-30'  ) B ON A.SID=B.gb91 LEFT JOIN Apm D on A.sga02=D.no  
    WHERE   A.sga91 > 0 AND   A.sga51   BETWEEN   '2014-06-01'  and   '2014-06-30'  AND D.cinvcname ='宁波博禄德'   
    AND B.不良分类 IS NOT NULL  
      

  3.   

    请压缩数据库给我,我帮你测试一下,
    发到[email protected]
      

  4.   

    那么可能是b和e关联后的结果导致
     我所有的LEFT JOIN  on  都是以A 为左连接, b与e没有做任何关联.
      

  5.   

    你是不是弄错了什么概念,left join只是说如果没数据左表也能出一条数据,没说如果有数据的也只出左表一条数据吧。left join的结果其实就是inner join的结果 + 左表没有被inner join关联出的数据而已。
    联系你的sql看,就是a和b,e做inner join后结果集 + a表中inner join以外数据的集合,所以数据多了很多,不是a和b,e做inner join后结果集造成的,就是a表中inner join以外数据的集合本身条数就多
      

  6.   

    你是不是弄错了什么概念,left join只是说如果没数据左表也能出一条数据,没说如果有数据的也只出左表一条数据吧。left join的结果其实就是inner join的结果 + 左表没有被inner join关联出的数据而已。
    联系你的sql看,就是a和b,e做inner join后结果集 + a表中inner join以外数据的集合,所以数据多了很多,不是a和b,e做inner join后结果集造成的,就是a表中inner join以外数据的集合本身条数就多
    就是a表中inner join以外数据的集合本身条数就多     我用以下SQL 测试过,只有4290条呢
    SELECT A.*  
    FROM Qcountsum A LEFT JOIN Apm D on A.sga02=D.no  LEFT JOIN 
     (SELECT gb91,gb92 厂内不良数量,gb94 厂外不良数量  FROM Qcountb WHERE gb51 BETWEEN  '2014-06-01'  and  '2014-06-30') E ON A.SID=E.gb91 
    WHERE   a.sga91 > 0 AND   a.sga51   BETWEEN   '2014-06-01'  and   '2014-06-30'  AND D.cinvcname ='宁波博禄德'  
      

  7.   

    拿掉AND D.cinvcname ='宁波博禄德'   有多少数据?你是不是弄错了什么概念,left join只是说如果没数据左表也能出一条数据,没说如果有数据的也只出左表一条数据吧。left join的结果其实就是inner join的结果 + 左表没有被inner join关联出的数据而已。
    联系你的sql看,就是a和b,e做inner join后结果集 + a表中inner join以外数据的集合,所以数据多了很多,不是a和b,e做inner join后结果集造成的,就是a表中inner join以外数据的集合本身条数就多
    就是a表中inner join以外数据的集合本身条数就多     我用以下SQL 测试过,只有4290条呢
    SELECT A.*  
    FROM Qcountsum A LEFT JOIN Apm D on A.sga02=D.no  LEFT JOIN 
     (SELECT gb91,gb92 厂内不良数量,gb94 厂外不良数量  FROM Qcountb WHERE gb51 BETWEEN  '2014-06-01'  and  '2014-06-30') E ON A.SID=E.gb91 
    WHERE   a.sga91 > 0 AND   a.sga51   BETWEEN   '2014-06-01'  and   '2014-06-30'  AND D.cinvcname ='宁波博禄德'  
      

  8.   

    那是因为你没有inner join b,只inner join了e,inner join又不是规定越join越少
      

  9.   

    那是因为你没有inner join b,只inner join了e,inner join又不是规定越join越少
     B ON A.SID=B.gb91    应该是 inner join b 吧
      

  10.   

    为什么老是只是单独两张表做关联,你用a inner join b和c一起看一下啊
      

  11.   

    SELECT  * 
    FROM Qcountsum A LEFT JOIN  (  )  B ON A.SID=B.gb91 
     LEFT JOIN Apm D on A.sga02=D.no  LEFT JOIN 
     () E ON A.SID=E.gb91 
    就会造成笛卡尔积吗,我测试一下.
      

  12.   

    A表
    ID
    1
    1
    1B表
    ID 
    1
    你说LEFT JOIN 多少条数据?????,或者 换过来A,B表也可以。就像上面说的,关联不定一是越来越少。可能越来越多。
      

  13.   

    为什么老是只是单独两张表做关联,你用a inner join b和c一起看一下啊
    我没有C盘,我大概的逻辑如下
    SELECT  * 
    FROM Qcountsum A LEFT JOIN  (  )  B ON A.SID=B.gb91 
     LEFT JOIN Apm D on A.sga02=D.no  LEFT JOIN 
     () E ON A.SID=E.gb91 
      

  14.   

    我以为是我自己逻辑错了,我做了以下测试CREATE TABLE [a] (
    [a] [int]  NULL,
    [b] [nvarchar]  (50) NULL)INSERT [a] ([a],[b]) VALUES ( 1,N'1')
    INSERT [a] ([a],[b]) VALUES ( 2,N'1')
    INSERT [a] ([a],[b]) VALUES ( 3,N'1')
    CREATE TABLE [b] (
    [a] [int]  NULL,
    [c] [int]  NULL)INSERT [b] ([a],[c]) VALUES ( 1,2)
    INSERT [b] ([a],[c]) VALUES ( 2,2)
    INSERT [b] ([a],[c]) VALUES ( 3,2)CREATE TABLE [c] (
    [a] [int]  NULL,
    [d] [int]  NULL)INSERT [c] ([a],[d]) VALUES ( 1,3)
    INSERT [c] ([a],[d]) VALUES ( 2,3)
    INSERT [c] ([a],[d]) VALUES ( 3,3)
    直接用SELECT * FROM a left join b on a.a=b.a left join c on a.a=c.a查询,只有三条记录,并没有发生笛卡尔积,哈哈,我不用怀疑我的逻辑了,但是问题到底在那里呢,好奇怪
      

  15.   

    高兴太早了吧,不多出数据的前提是你a,b,c三张表a列没有重复数据,你能保证你执行的sql的join列不重复吗,如果不能保证你这例子等于白举