SQL2005+有效;WITH BCte AS(
SELECT ROW_NUMBER()OVER(ORDER BY GETDATE())RN,* FROM B
)
,CCte AS(
SELECT ROW_NUMBER()OVER(ORDER BY GETDATE())RN,* FROM C
)
,DCte AS(
SELECT ROW_NUMBER()OVER(ORDER BY GETDATE())RN,* FROM D
)
SELECT A.*,T1.Car,T2.Credit,T3.Hose FROM A
LEFT JOIN BCte T1 ON A.cID=T1.cID
FULL JOIN CCte T2 ON A.cID=T2.cID AND T1.RN=T2.RN
FULL JOIN DCte T3 ON A.cID=T3.cID AND T1.RN=T3.RN

解决方案 »

  1.   

    ---1楼的 将LEFT JOIN 修改成INNER JOIN 就正确了;WITH BCte AS(
    SELECT ROW_NUMBER()OVER(ORDER BY GETDATE())RN,* FROM B
    )
    ,CCte AS(
    SELECT ROW_NUMBER()OVER(ORDER BY GETDATE())RN,* FROM C
    )
    ,DCte AS(
    SELECT ROW_NUMBER()OVER(ORDER BY GETDATE())RN,* FROM D
    )
    SELECT A.*,T1.Car,T2.Credit,T3.Hose FROM A
    INNER JOIN BCte T1 ON A.cID=T1.cID
    FULL JOIN CCte T2 ON A.cID=T2.cID AND T1.RN=T2.RN
    FULL JOIN DCte T3 ON A.cID=T3.cID AND T1.RN=T3.RN
      

  2.   


    我试了这个方法了,可以实现上述效果,但是在添加数据后就不正确了,不知如何解决
    我在表C、D、E分别给客户李四增加数据 用该方法查询后得出以下结果Car和Hose的字段正确,但是Credit两个数据到张三里面去了,正确结果应该为
    -------------------------------------------------------------------------------------------------------------
    1         张三 本田飞度 广发信用卡              怡海花园14号楼201
    1         张三 POLO         兴业信用卡              富锦家园7号楼702
    NULL NULL NULL         民生信用卡              NULL
    NULL NULL NULL NULL                          NULL
    NULL NULL NULL NULL                          NULL
    2         李四 奥迪A6         建设银行信用卡        9号公馆1号楼
    NULL NULL NULL         中国银行信用卡        总部公寓2号楼
    NULL NULL NULL         NULL                     世纪花园15栋
      

  3.   


    我试了这个方法了,可以实现上述效果,但是在添加数据后就不正确了,不知如何解决
    我在表C、D、E分别给客户李四增加数据 用该方法查询后得出以下结果Car和Hose的字段正确,但是Credit两个数据到张三里面去了,正确结果应该为
    -------------------------------------------------------------------------------------------------------------
    1         张三 本田飞度 广发信用卡              怡海花园14号楼201
    1         张三 POLO         兴业信用卡              富锦家园7号楼702
    NULL NULL NULL         民生信用卡              NULL
    NULL NULL NULL NULL                          NULL
    NULL NULL NULL NULL                          NULL
    2         李四 奥迪A6         建设银行信用卡        9号公馆1号楼
    NULL NULL NULL         中国银行信用卡        总部公寓2号楼
    NULL NULL NULL         NULL                     世纪花园15栋
      

  4.   

    能否实现
    1 张三 本田飞度 广发信用卡 怡海花园14号楼201
    1 张三 POLO 兴业信用卡 富锦家园7号楼702
    1     NULL NULL 民生信用卡 NULL
    2 李四 奥迪A6 建设银行信用卡 9号公馆1号楼
    2     NULL NULL 中国银行信用卡总部公寓2号楼
    2     NULL NULL NULL 世纪花园15栋
      

  5.   

    同cID的记录数小于2048有效;WITH ACte AS(
    SELECT TB2.number RN,TB1.* FROM A TB1,master..spt_values TB2 WHERE TB2.type='P'
    )
    ,BCte AS(
    SELECT ROW_NUMBER()OVER(PARTITION BY cID ORDER BY GETDATE())RN,* FROM B
    )
    ,CCte AS(
    SELECT ROW_NUMBER()OVER(PARTITION BY cID ORDER BY GETDATE())RN,* FROM C
    )
    ,DCte AS(
    SELECT ROW_NUMBER()OVER(PARTITION BY cID ORDER BY GETDATE())RN,* FROM D
    )
    SELECT T.cID,T.NAME,T1.Car,T2.Credit,T3.Hose FROM ACte T
    LEFT JOIN BCte T1 ON T.cID=T1.cID AND T.RN=T1.RN
    FULL JOIN CCte T2 ON T.cID=T2.cID AND T.RN=T2.RN
    FULL JOIN DCte T3 ON T.cID=T3.cID AND T.RN=T3.RN
    WHERE (T1.cID IS NOT NULL OR T2.cID IS NOT NULL OR T3.cID IS NOT NULL)
    ORDER BY T.cID,T.RN
      

  6.   


    我A表里才有5条数据,用SELECT TB2.number RN,TB1.* FROM A TB1,master..spt_values TB2 WHERE TB2.type='P' 查出了10240最大的条数,每个cID的单条记录都超过了2048,不知为何?
      

  7.   

    我找到原因了,SQL写的太复杂了,有一个地方没有注意到,调试到了 谢谢大神的帮忙