日期:2014-05-18  浏览次数:20510 次

求帮忙解决一SQL查询语句问题,该问题肯能比较复杂,谢谢大家。
CREATE TABLE `TEST` (
`tb` VARCHAR(50) ,
`chan` INT ,
`chanone` INT ,
`chantwo` INT ,
`class` INT ,
`name` VARCHAR (100)
); 
INSERT INTO TEST VALUES('13511' , 135, 1 , 1 , 1 , '中国');
INSERT INTO TEST VALUES('13522', 135 , 2 , 2 , 2 , '浙江');
INSERT INTO TEST VALUES('13523', 135 , 2 , 3 , 2 , '湖南');
INSERT INTO TEST VALUES('13542', 135 , 4 , 2 , 3 , '杭州');
INSERT INTO TEST VALUES('13543' , 135 , 4 , 3 , 3 , '长沙');
INSERT INTO TEST VALUES('13611', 136 , 1 , 1 , 1 , '美国');
INSERT INTO TEST VALUES('13622', 136 , 2 , 2, 2 , '加州1');
INSERT INTO TEST VALUES('13623', 136 , 2 , 3 , 2 , '加州2');
INSERT INTO TEST VALUES('13644', 136 , 4 , 4 , 3 , '老加');
INSERT INTO TEST VALUES('13645', 136 , 4 , 5 , 3 , '小加');
数据:
tb chan chanone chantwo class nm 
13511 135 1 1 1 中国
13522 135 2 2 2 浙江
13523 135 2 3 2 湖南
13542 135 4 2 3 杭州
13543 135 4 3 3 长沙
13611 136 1 1 1 美国
13622 136 2 2 2 加州1
13623 136 2 3 2 加州2
13644 136 4 4 3 老加
13645 136 4 5 3 小加


根据同一chan下的class的级别来显示结果的,tb是唯一的,但是不是主键。tb是chan和chanone chantwo三个字段的结合。
class 1 中国
class 2 中国-湖南
class 3 中国-湖南-长沙

要求显示的结果: 
tb chan chanone chantwo class nm 
13511 135 1 1 1 中国
13522 135 2 2 2 中国-浙江
13523 135 2 3 2 中国-湖南
13542 135 4 2 3 中国-浙江-杭州
13543 135 4 3 3 中国-湖南-长沙
13611 136 1 1 1 美国
13622 136 2 2 2 美国-加州1
13623 136 2 3 2 美国-加州2
13642 136 4 2 3 美国-加州1-老加
13643 136 4 3 3 美国-加州2-小加


------解决方案--------------------
SQL Server 2008测试通过,2000不可以
SQL code

IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 'TEST')
BEGIN
    DROP TABLE TEST
END
GO
CREATE TABLE TEST (
tb VARCHAR(50) ,
chan INT ,
chanone INT ,
chantwo INT ,
class INT ,
name VARCHAR (100)
);  
INSERT INTO TEST VALUES('13511' , 135, 1 , 1 , 1 , '中国');
INSERT INTO TEST VALUES('13522', 135 , 2 , 2 , 2 , '浙江');
INSERT INTO TEST VALUES('13523', 135 , 2 , 3 , 2 , '湖南');
INSERT INTO TEST VALUES('13542', 135 , 4 , 2 , 3 , '杭州');
INSERT INTO TEST VALUES('13543' , 135 , 4 , 3 , 3 , '长沙');
INSERT INTO TEST VALUES('13611', 136 , 1 , 1 , 1 , '美国');
INSERT INTO TEST VALUES('13622', 136 , 2 , 2, 2 , '加州1');
INSERT INTO TEST VALUES('13623', 136 , 2 , 3 , 2 , '加州2');
INSERT INTO TEST VALUES('13644', 136 , 4 , 2 , 3 , '老加');
INSERT INTO TEST VALUES('13645', 136 , 4 , 3 , 3 , '小加');

GO
SELECT tb, chan, chanone, chantwo, class, stuff(( select '-'+ Name 
                from TEST AS A
                where B.chan = A.chan AND (B.chantwo = A.chantwo OR A.chantwo = 1) AND B.class >= A.class for xml path('')),1,1,'') as nm
FROM TEST AS B

tb    chan    chanone    chantwo    class    nm
13511    135    1    1    1    中国
13522    135    2    2    2    中国-浙江
13523    135    2    3    2    中国-湖南
13542    135    4    2    3    中国-浙江-杭州
13543    135    4    3    3    中国-湖南-长沙
13611    136    1    1    1    美国
13622    136    2    2    2    美国-加州1
13623    136    2    3    2    美国-加州2
13644    136    4    2    3    美国-加州1-老加
13645    136    4    3    3    美国-加州2-小加