日期:2014-05-17  浏览次数:20653 次

一个SQL的面试题,题目没怎么看懂,帮忙分析一下。
设计一个产品目录的产品(名称,价格,描述),和N级和多个类别和制造商(名称,标识)。绘制归主外键的表结构和编写SQL检索所有n级类别产品的递归(Draw normalized table structure with primary & foreign keys and write SQL to retrieve all n-level category products recursively)(怎么翻译?),预期输出:
图书 - 哲学 - 形而上学
图书 - 哲学 - 儒家 - 孟子
图书 - 文学 - 林语堂
软件 - 工具 - 文件管理

------解决方案--------------------
BOM模型,你可以到网上找找
------解决方案--------------------
其实就是一个表结构,有上下级关系的。

让你写个递归查询,显示所有n层级上的数据。
------解决方案--------------------
--参考一下实例
--> 生成测试数据表:tb
IF NOT OBJECT_ID('[tb]') IS NULL
 DROP TABLE [tb]
GO
CREATE TABLE [tb](GUID INT IDENTITY,[col1] NVARCHAR(10),[col2] NVARCHAR(20))
INSERT [tb]
SELECT N'A','01' UNION ALL
SELECT N'B','01.01' UNION ALL
SELECT N'C','01.01.01' UNION ALL
SELECT N'F','01.01.01.01' UNION ALL
SELECT N'E','01.01.01.02' UNION ALL
SELECT N'D','01.01.01.03' UNION ALL
SELECT N'O','02' UNION ALL
SELECT N'P','02.01' UNION ALL
SELECT N'Q','02.01.01' 
GO
--SELECT * FROM [tb]

-->SQL查询如下:

---另一种方法
;WITH T AS
(
   SELECT *,PATH=CAST([COL1] AS VARCHAR(1000)) FROM TB A
       WHERE NOT EXISTS(
        SELECT 1 FROM TB 
     WHERE A.COL2 LIKE COL2+'%' 
   AND LEN(A.COL2)>LEN(COL2))
   UNION ALL
   SELECT A.*,CAST(PATH+'-->'+A.COL1 AS VARCHAR(1000))
   FROM TB A 
   JOIN T B 
        ON A.COL2 LIKE B.COL2+'%' 

           AND LEN(A.COL2)-3=LEN(B.COL2)
)

SELECT * FROM T ORDER BY LEFT(COL2,2)

/*

GUID        COL1        COL2                  PATH

----------- ---------- -------------------- --------------------

1           A          01                   A

2           B          01.01                A-->B

3