2017-10-07 31 views
-4

我是新来的PL/SQL需要以下情况的查询:编写一个查询将在每个主题与标记一起取前3名学生的名字他们得分

2表:配有1一个没有,命名 第二与卷没有,主题ñ标记 需要编写一个查询将在每个主题与他们得分

我写了下面的查询上述标记沿取前3名学生的名字,但它不取正确的结果:

SELECT TABLE1.NAME, MAX(TABLE2.MARKS) 
FROM 
TABLE1 
INNER JOIN 
TABLE2 
ON TABLE1.ROLL_NO = TABLE2.ROLL_NO 
GROUP BY SUB 
ORDER BY TABLE2.MARKS 
HAVING ROWNUM <3 

以下是表格数据:

CREATE TABLE STUDENT (ROLL_NO INT PRIMARY KEY, NAME VARCHAR(20)); 
INSERT INTO STUDENT VALUES (1,'NIKHIL'); 
INSERT INTO STUDENT VALUES (2,'VARUN'); 
INSERT INTO STUDENT VALUES (3,'NISHANT'); 
INSERT INTO STUDENT VALUES (4,'VISHAL'); 
INSERT INTO STUDENT VALUES (5,'GOURAV'); 
INSERT INTO STUDENT VALUES (6,'HEMANT'); 
INSERT INTO STUDENT VALUES (7,'SHUBHAM'); 
INSERT INTO STUDENT VALUES (8,'DHAWAN'); 
INSERT INTO STUDENT VALUES (9,'GAUTAM'); 


CREATE TABLE MARKS (ROLL_NO INT, SUBJECT VARCHAR(20), MARKS INT); 
INSERT INTO MARKS VALUES('1','MATHS','92'); 
INSERT INTO MARKS VALUES('1','SCIENCE','80'); 
INSERT INTO MARKS VALUES('1','ENGLISH','98'); 
INSERT INTO MARKS VALUES('1','HINDI','81'); 
INSERT INTO MARKS VALUES('2','MATHS','89'); 
INSERT INTO MARKS VALUES('2','SCIENCE','100'); 
INSERT INTO MARKS VALUES('2','ENGLISH','81'); 
INSERT INTO MARKS VALUES('2','HINDI','82'); 
INSERT INTO MARKS VALUES('3','MATHS','98'); 
INSERT INTO MARKS VALUES('3','SCIENCE','92'); 
INSERT INTO MARKS VALUES('3','ENGLISH','88'); 
INSERT INTO MARKS VALUES('3','HINDI','83'); 
INSERT INTO MARKS VALUES('4','MATHS','88'); 
INSERT INTO MARKS VALUES('4','SCIENCE','82'); 
INSERT INTO MARKS VALUES('4','ENGLISH','85'); 
INSERT INTO MARKS VALUES('4','HINDI','97'); 
INSERT INTO MARKS VALUES('5','MATHS','94'); 
INSERT INTO MARKS VALUES('5','SCIENCE','90'); 
INSERT INTO MARKS VALUES('5','ENGLISH','97'); 
INSERT INTO MARKS VALUES('5','HINDI','89'); 
INSERT INTO MARKS VALUES('6','MATHS','89'); 
INSERT INTO MARKS VALUES('6','SCIENCE','82'); 
INSERT INTO MARKS VALUES('6','ENGLISH','84'); 
INSERT INTO MARKS VALUES('6','HINDI','85'); 
INSERT INTO MARKS VALUES('7','MATHS','82'); 
INSERT INTO MARKS VALUES('7','SCIENCE','100'); 
INSERT INTO MARKS VALUES('7','ENGLISH','92'); 
INSERT INTO MARKS VALUES('7','HINDI','98'); 
INSERT INTO MARKS VALUES('8','MATHS','99'); 
INSERT INTO MARKS VALUES('8','SCIENCE','91'); 
INSERT INTO MARKS VALUES('8','ENGLISH','86'); 
INSERT INTO MARKS VALUES('8','HINDI','82'); 
INSERT INTO MARKS VALUES('9','MATHS','100'); 
INSERT INTO MARKS VALUES('9','SCIENCE','95'); 
INSERT INTO MARKS VALUES('9','ENGLISH','81'); 
INSERT INTO MARKS VALUES('9','HINDI','81'); 
+0

分享带有示例数据表。您将得到更好的hulp这种方式。该解决方案包括MySQL的用户变量,因为ROWNUM犯规在MySQL –

+0

存在。如果你是新来的PL/SQL,为什么要标记MySQL? – Strawberry

+0

我相信你在使用Oracle – alejandrogiron

回答

1

您可以使用像这样的ROW_NUMBER窗口函数。

SELECT 
* 
FROM ( 

    SELECT 
    MARKS.ROLL_NO 
    , MARKS.SUBJECT 
    , MARKS.MARKS 
    , ROW_NUMBER() OVER (PARTITION BY ROLL_NO ORDER BY MARKS DESC) AS rank 
    FROM 
    MARKS 
) MARKS_RANKED 
INNER JOIN 
STUDENT 
ON 
MARKS_RANKED.ROLL_NO = STUDENT.ROLL_NO 
WHERE 
    rank <= 3 

演示http://www.sqlfiddle.com/#!4/05776/41

相关问题