一个SQL的面试题,题目没怎么看懂,帮忙分析一下。设计一个产品目录的产品(名称,价格,描述),和N级和多个类别
一个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 C 01.01.01 A-->B-->C 4 F 01.01.01.01 A-->B-->C-->F 5 E 01.01.01.02 A-->B-->C-->E 6 D 01.01.01.03 A-->B-->C-->D 7 O 02 O 8 P 02.01 O-->P 9 Q 02.01.01 O-->P-->Q (9 行受影响) */ ;WITH T AS ( SELECT *,CAST(COL1 AS VARCHAR(1000)) AS PATH FROM TB WHERE COL2 NOT LIKE '%.%' UNION ALL SELECT A.*,CAST(B.PATH+'-->'+A.COL1 AS VARCHAR(1000)) FROM TB A,T B WHERE A.COL2 LIKE B.COL2+'.[01-99][01-99]' ) SELECT * FROM T ORDER BY LEFT(COL2,2) /* GUID COL1 COL2 PATH ----------- ---------- -------------------- -------------------- 1 A 01 A 2 B 01.01 A-->B 3 C 01.01.01 A-->B-->C 4 F 01.01.01.01 A-->B-->C-->F 5 E 01.01.01.02 A-->B-->C-->E 6 D 01.01.01.03 A-->B-->C-->D 7 O 02 O 8 P 02.01 O-->P 9 Q 02.01.01 O-->P-->Q (9 行受影响) */
[解决办法] 产品信息表: 产品ID,产品名称,价格,描述,制造商ID,类别ID..
产品类别表: 类别ID,父类别ID,名称,级别..
制造商表: 制造商ID,制造商名称,标识..
[解决办法] 引用: Quote: 引用: 就是科目层级而已引用: 产品信息表: 产品ID,产品名称,价格,描述,制造商ID,类别ID.. 产品类别表: 类别ID,父类别ID,名称,级别.. 制造商表: 制造商ID,制造商名称,标识..Quote: 引用: (Draw normalized table structure with primary & foreign keys and write SQL to retrieve all n-level category products recursively)(怎么翻译?) 绘制有主键,外键的表结构,并用SQL实现显示产品的所有等级和类别的信息. 引用: 引用: 其实就是一个表结构,有上下级关系的。 让你写个递归查询,显示所有n层级上的数据。 引用: BOM模型,你可以到网上找找 就相当于树么?我是这样理解的。
对,就是树,类似于这样的结构,比如: id,parent_id 1 0 2 1 3 1 4 2 ...[解决办法] 引用: --参考一下实例 --> 生成测试数据表: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 C 01.01.01 A-->B-->C 4 F 01.01.01.01 A-->B-->C-->F 5 E 01.01.01.02 A-->B-->C-->E 6 D 01.01.01.03 A-->B-->C-->D 7 O 02 O 8 P 02.01 O-->P 9 Q 02.01.01 O-->P-->Q (9 行受影响) */ ;WITH T AS ( SELECT *,CAST(COL1 AS VARCHAR(1000)) AS PATH FROM TB WHERE COL2 NOT LIKE '%.%' UNION ALL SELECT A.*,CAST(B.PATH+'-->'+A.COL1 AS VARCHAR(1000)) FROM TB A,T B WHERE A.COL2 LIKE B.COL2+'.[01-99][01-99]' ) SELECT * FROM T ORDER BY LEFT(COL2,2) /* GUID COL1 COL2 PATH ----------- ---------- -------------------- -------------------- 1 A 01 A 2 B 01.01 A-->B 3 C 01.01.01 A-->B-->C 4 F 01.01.01.01 A-->B-->C-->F 5 E 01.01.01.02 A-->B-->C-->E 6 D 01.01.01.03 A-->B-->C-->D 7 O 02 O 8 P 02.01 O-->P 9 Q 02.01.01 O-->P-->Q (9 行受影响) */
研究了许久,还是没能弄明白你的查询SQL[解决办法] 引用: Quote: 引用: --参考一下实例 --> 生成测试数据表: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 C 01.01.01 A-->B-->C 4 F 01.01.01.01 A-->B-->C-->F 5 E 01.01.01.02 A-->B-->C-->E 6 D 01.01.01.03 A-->B-->C-->D 7 O 02 O 8 P 02.01 O-->P 9 Q 02.01.01 O-->P-->Q (9 行受影响) */ ;WITH T AS ( SELECT *,CAST(COL1 AS VARCHAR(1000)) AS PATH FROM TB WHERE COL2 NOT LIKE '%.%' UNION ALL SELECT A.*,CAST(B.PATH+'-->'+A.COL1 AS VARCHAR(1000)) FROM TB A,T B WHERE A.COL2 LIKE B.COL2+'.[01-99][01-99]' ) SELECT * FROM T ORDER BY LEFT(COL2,2) /* GUID COL1 COL2 PATH ----------- ---------- -------------------- -------------------- 1 A 01 A 2 B 01.01 A-->B 3 C 01.01.01 A-->B-->C 4 F 01.01.01.01 A-->B-->C-->F 5 E 01.01.01.02 A-->B-->C-->E 6 D 01.01.01.03 A-->B-->C-->D 7 O 02 O 8 P 02.01 O-->P 9 Q 02.01.01 O-->P-->Q (9 行受影响) */
研究了许久,还是没能弄明白你的查询SQL 查看了WITH AS 的用法,现在明白了[解决办法] 请问,with as 这里怎么引用自身,怎么理解的??? UNION ALL SELECT A.*,CAST(PATH+'-->'+A.COL1 AS VARCHAR(1000)) FROM TB A JOIN T B