当前位置: 代码迷 >> Sql Server >> sql,表如图
  详细解决方案

sql,表如图

热度:54   发布时间:2016-04-24 10:10:44.0
求一个sql,表如图
表1
表2
表3
查询结果
其中表1的id分别和表2、表3的cid对应,表2和表三没有任何联系。就是想把三个表分别cname和sname和tname三列“拼接”起来的意思
------解决方案--------------------
--2005以上版本,比较笨的办法
select case when a.cname is null then b.cname else a.cname end as cname,a.sname,b.tname from 
(select * from t1 , (select * ,rn=ROW_NUMBER() over(partition by cid order by sname) from t2) t4 where t1.ID=t4.cid) a
full join
(select * from  t1,(select *,rn=ROW_NUMBER() over (partition by cid order by tname) from t3) t5 where t1.ID=t5.cid) b
on a.cid=b.cid and a.rn=b.rn

------解决方案--------------------
参考楼上的,清除他语句里面因为用*取所有列导致的多个id问题
其中c为第一个表,s为第二个表,t为第三个表

SELECT (CASE
WHEN S0.cname IS NULL THEN T0.cname
ELSE S0.cname
END) AS cname
    , S0.sname
    , T0.tname
FROM (SELECT c.id
, c.cname
, S1.cid
, S1.sname
, S1.rn
      FROM c
          , (SELECT *
                 , rn = ROW_NUMBER () OVER (PARTITION BY cid ORDER BY sname)
             FROM s) S1
      WHERE c.ID = S1.cid) S0
    FULL JOIN
    (SELECT c.id
     , c.cname
     , T1.cid
     , T1.tname
     , T1.rn
  FROM c
       , (SELECT *
              , rn = ROW_NUMBER () OVER (PARTITION BY cid ORDER BY tname)
          FROM t) T1
   WHERE c.ID = T1.cid) T0
ON S0.cid = T0.cid AND S0.rn = T0.rn
  相关解决方案