select distinct name from a join b on a.number=b.number where Score in (select top 2 Score from a where number=b.number order by Score desc)
select distinct name from a join b on a.number=b.number where (select count(distinct Score) from a where number=a.number and Score>a.Score)=1
--别名错了 select distinct name from a as t join b on t.number=b.number where (select count(distinct Score) from a where number=t.number and Score>t.Score)=1
select tb.Number,tb.Name,tb.Class,ta.Score from a as ta left join b as tb on ta.Number = tb.Number where (select count(1) from a,b where a.number = b.number and b.Class= tb.Class and a.Score >=ta.Score) = 2
CREATE TABLE #A (S_NO VARCHAR(10),S_NUM INT) INSERT INTO #A SELECT 101,80 INSERT INTO #A SELECT 102,65 INSERT INTO #A SELECT 103,80 INSERT INTO #A SELECT 104,75 INSERT INTO #A SELECT 105,95 INSERT INTO #A SELECT 106,88 INSERT INTO #A SELECT 107,90CREATE TABLE #B (S_NO VARCHAR(10),S_NAME VARCHAR(10),S_CLASS VARCHAR(10)) INSERT INTO #B SELECT 101,'A','A01' INSERT INTO #B SELECT 102,'B','A01' INSERT INTO #B SELECT 103,'C','A01' INSERT INTO #B SELECT 104,'D','A02' INSERT INTO #B SELECT 105,'E','A02' INSERT INTO #B SELECT 106,'F','A02' INSERT INTO #B SELECT 107,'G','A01' SELECT A.S_NO,B.S_NAME,B.S_CLASS,A.S_NUM INTO #C FROM #A A LEFT JOIN #B B ON A.S_NO=B.S_NOSELECT * FROM #C A WHERE (SELECT COUNT(*) FROM #C WHERE S_CLASS=A.S_CLASS AND S_NUM>A.S_NUM)<2 AND EXISTS (SELECT 1 FROM #C WHERE S_CLASS=A.S_CLASS AND S_NUM>A.S_NUM ) DROP TABLE #A,#B,#C /** S_NO S_NAME S_CLASS S_NUM ---------- ---------- ---------- ----------- 101 A A01 80 103 C A01 80 106 F A02 88
select Name from B join A on B.Number = A.Number where A.Score = ( select top 1 Score from (select distinct top 2 Score from A order by Score desc) as T order by Score )
本帖最后由 roy_88 于 2008-11-28 18:22:03 编辑
select 姓名 from ( select 姓名,Row_number()over(partition by 班级,学号 order by 成绩) as num from (select 学生表.学号 as 学号 ,学生表.班级 as 班级, 学生表.姓名 as 姓名, 成绩表.成绩 as 成绩 from 成绩表,学生表 where 学生表.学号=成绩表.学号 ) as AA ) AS Tabwhere num = 2
CREATE TABLE #A (S_NO VARCHAR(10),S_NUM INT) INSERT INTO #A SELECT 101,80 INSERT INTO #A SELECT 102,65 INSERT INTO #A SELECT 103,80 INSERT INTO #A SELECT 104,75 INSERT INTO #A SELECT 105,95 INSERT INTO #A SELECT 106,88 INSERT INTO #A SELECT 107,90CREATE TABLE #B (S_NO VARCHAR(10),S_NAME VARCHAR(10),S_CLASS VARCHAR(10)) INSERT INTO #B SELECT 101,'A','A01' INSERT INTO #B SELECT 102,'B','A01' INSERT INTO #B SELECT 103,'C','A01' INSERT INTO #B SELECT 104,'D','A02' INSERT INTO #B SELECT 105,'E','A02' INSERT INTO #B SELECT 106,'F','A02' INSERT INTO #B SELECT 107,'G','A01' SELECT A.S_NO,B.S_NAME,B.S_CLASS,A.S_NUM INTO #C FROM #A A LEFT JOIN #B B ON A.S_NO=B.S_NOSELECT * FROM #C A WHERE (SELECT COUNT(DISTINCT S_NUM) FROM #C WHERE S_CLASS=A.S_CLASS AND S_NUM<A.S_NUM)=1 DROP TABLE #A,#B,#C
select distinct name
from a join b on a.number=b.number
where Score in (select top 2 Score from a where number=b.number order by Score desc)
select distinct name
from a join b on a.number=b.number
where (select count(distinct Score) from a where number=a.number and Score>a.Score)=1
--别名错了
select distinct name
from a as t join b on t.number=b.number
where (select count(distinct Score) from a where number=t.number and Score>t.Score)=1
from a as ta
left join b as tb
on ta.Number = tb.Number
where (select count(1) from a,b where a.number = b.number and b.Class= tb.Class and a.Score >=ta.Score) = 2
INSERT INTO #A SELECT 101,80
INSERT INTO #A SELECT 102,65
INSERT INTO #A SELECT 103,80
INSERT INTO #A SELECT 104,75
INSERT INTO #A SELECT 105,95
INSERT INTO #A SELECT 106,88
INSERT INTO #A SELECT 107,90CREATE TABLE #B (S_NO VARCHAR(10),S_NAME VARCHAR(10),S_CLASS VARCHAR(10))
INSERT INTO #B SELECT 101,'A','A01'
INSERT INTO #B SELECT 102,'B','A01'
INSERT INTO #B SELECT 103,'C','A01'
INSERT INTO #B SELECT 104,'D','A02'
INSERT INTO #B SELECT 105,'E','A02'
INSERT INTO #B SELECT 106,'F','A02'
INSERT INTO #B SELECT 107,'G','A01'
SELECT A.S_NO,B.S_NAME,B.S_CLASS,A.S_NUM INTO #C FROM #A A LEFT JOIN #B B ON A.S_NO=B.S_NOSELECT * FROM #C A
WHERE (SELECT COUNT(*) FROM #C WHERE S_CLASS=A.S_CLASS AND S_NUM>A.S_NUM)<2
AND EXISTS (SELECT 1 FROM #C WHERE S_CLASS=A.S_CLASS AND S_NUM>A.S_NUM )
DROP TABLE #A,#B,#C
/**
S_NO S_NAME S_CLASS S_NUM
---------- ---------- ---------- -----------
101 A A01 80
103 C A01 80
106 F A02 88
select Name from B join A on B.Number = A.Number where A.Score = (
select top 1 Score from (select distinct top 2 Score from A order by Score desc) as T order by Score
)
from
(
select 姓名,Row_number()over(partition by 班级,学号 order by 成绩) as num
from
(select 学生表.学号 as 学号 ,学生表.班级 as 班级, 学生表.姓名 as 姓名, 成绩表.成绩 as 成绩
from 成绩表,学生表
where 学生表.学号=成绩表.学号 ) as AA ) AS Tabwhere num = 2
INSERT INTO #A SELECT 101,80
INSERT INTO #A SELECT 102,65
INSERT INTO #A SELECT 103,80
INSERT INTO #A SELECT 104,75
INSERT INTO #A SELECT 105,95
INSERT INTO #A SELECT 106,88
INSERT INTO #A SELECT 107,90CREATE TABLE #B (S_NO VARCHAR(10),S_NAME VARCHAR(10),S_CLASS VARCHAR(10))
INSERT INTO #B SELECT 101,'A','A01'
INSERT INTO #B SELECT 102,'B','A01'
INSERT INTO #B SELECT 103,'C','A01'
INSERT INTO #B SELECT 104,'D','A02'
INSERT INTO #B SELECT 105,'E','A02'
INSERT INTO #B SELECT 106,'F','A02'
INSERT INTO #B SELECT 107,'G','A01'
SELECT A.S_NO,B.S_NAME,B.S_CLASS,A.S_NUM INTO #C FROM #A A LEFT JOIN #B B ON A.S_NO=B.S_NOSELECT *
FROM #C A
WHERE (SELECT COUNT(DISTINCT S_NUM) FROM #C WHERE S_CLASS=A.S_CLASS AND S_NUM<A.S_NUM)=1
DROP TABLE #A,#B,#C