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)