34,838
社区成员




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,90
CREATE 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_NO
SELECT *
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
*
from
(select a.Number,b.Name,b.Class,dense_rank()over(partition by b.Class order by a.Score desc) num from A join B on a.Number=b.Number)t
where
num=2
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
)
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,90
CREATE 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_NO
SELECT * 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 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
--别名错了
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 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 join b on a.number=b.number
where Score in (select top 2 Score from a where number=b.number order by Score desc)