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

sql嵌套查询
谁有这方面的笔试题?我最头疼这方面的题。

------解决方案--------------------
id name date
1  1   2
2  1   3 
3  2   4
4  2   5

得到
name   date
1     3
2     5

相同的name取最大date! 不知道这算不算!
------解决方案--------------------
多层嵌套
子查询自身可以包括一个或多个子查询。一个语句中可以嵌套任意数量的子查询。

下面的查询查找至少曾参与编写一本热门计算机书的作者姓名。

USE pubs
SELECT au_lname, au_fname
FROM authors
WHERE au_id IN
(SELECT au_id
FROM titleauthor
WHERE title_id IN
(SELECT title_id
FROM titles
WHERE type = 'popular_comp '))

下面是结果集:

au_lname au_fname
---------------------------------------- --------------------
Carson Cheryl
Dull Ann
Locksley Charlene
Hunter Sheryl

(4 row(s) affected)

最内部的查询返回书名 ID 号 PC1035、PC8888 和 PC9999。再上一层的查询使用这些书名 ID 进行评估,并返回作者的 ID 号。最后,外部查询使用作者的 ID 号查找作者的姓名。

也可以使用一个联接表示该查询:

USE pubs
SELECT au_lname, au_fname
FROM authors INNER JOIN titleauthor ON authors.au_id = titleauthor.au_id
JOIN titles ON titleauthor.title_id = titles.title_id
WHERE type = 'popular_comp '


------解决方案--------------------
这有关自定义函数嵌套例子,
存储过程(自定义函数)最多可以嵌套 32 级.

原问题,基本的要求是:

3-10 格式化成 00030010
3-10-1 格式化成 00030010001
....
10 格式化成 0010
10-1 格式化成 0010001

参考答案:

CREATE FUNCTION fn_Format(@S nvarchar(100),@Key nvarchar(10),@Len int)
RETURNS nvarchar(100)
AS
BEGIN
DECLARE @Temp nvarchar(50)
IF CHARINDEX(@Key,@S)> 0
BEGIN
SET @Temp=left(@S,CHARINDEX(@Key,@S)-1)
SET @Temp= RIGHT(POWER(10,@Len-LEN(@Temp)),@Len-LEN(@Temp))+@Temp
SET @S=@Temp+dbo.fn_Format(RIGHT(@S,LEN(@S)-CHARINDEX(@Key,@S)),@Key,@Len)
END
ELSE
SET @S= RIGHT(POWER(10,@Len-LEN(@S)),@Len-LEN(@S))+@S
RETURN @S
END
GO
PRINT dbo.fn_Format( '2 ', '- ',4)
PRINT dbo.fn_Format( '3-10 ', '- ',4)
PRINT dbo.fn_Format( '3-10-1 ', '- ',4)
DROP FUNCTION fn_Format

/*
结果:
0002
00030010
000300100001
*/

问题来源:http://community.csdn.net/Expert/topic/5345/5345618.xml?temp=.2492182


------解决方案--------------------
select * from 表 where name=(select distinct name group by name)
and date=max(date)