首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

一个SQL的面试题,题目没如何看懂,帮忙分析一下

2013-11-23 
一个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 的用法,现在明白了一个SQL的面试题,题目没如何看懂,帮忙分析一下
[解决办法]
请问,with as 这里怎么引用自身,怎么理解的???

UNION ALL
   SELECT A.*,CAST(PATH+'-->'+A.COL1 AS VARCHAR(1000))
   FROM TB A 
   JOIN T B 

热点排行