Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于同一列不同行中的值查询特定数据时出现问题_Sql_Oracle - Fatal编程技术网

Sql 基于同一列不同行中的值查询特定数据时出现问题

Sql 基于同一列不同行中的值查询特定数据时出现问题,sql,oracle,Sql,Oracle,我正在创建一个学院数据库,表如下所示: create table depts( deptcode char(3) primary key, deptname char(70) not null); create table students( rollno number(2) primary key, name char(50), bdate date check(bdate < TO_DATE('2004-01-01','YYYY-MM-DD')), deptcode char(3)

我正在创建一个学院数据库,表如下所示:

create table depts(
deptcode char(3) primary key,
deptname char(70) not null);

create table students(
rollno number(2) primary key,
name char(50),
bdate date check(bdate < TO_DATE('2004-01-01','YYYY-MM-DD')),
deptcode char(3) references depts(deptcode)
on delete cascade,
hostel number check(hostel<20),
parent_inc number(8,1));

create table faculty(
fac_code char(2) primary key,
fac_name char(50) not null,
fac_dept char(3) references depts(deptcode)
on delete cascade);



//for courses offered by the college

create table crs_offrd(
crs_code char(5) primary key,
crs_name char(35) not null,
crs_credits number(2,1),
crs_fac_cd char(2) references faculty(fac_code)
on delete cascade);



// for course registered by students*

create table crs_regd(
crs_rollno number(2) references students(rollno),
crs_cd char(5) references crs_offrd(crs_code)
on delete cascade,
marks number(5,2),
primary key(crs_rollno,crs_cd));
我不知道如何同时检查CS103和CS106中的分数,因为两个科目的分数位于不同行的同一列中,并且查询一次处理一行

我遵循了这个问题,但它只适用于一列,它将列出以分隔的值,但我需要获得相应的主题名称,在其中获得该标记


如果需要任何其他信息,请发表意见。

您可以通过以下方式使用group:

-- CTE IS USED TO FETCH THE REQUIRED DATA FROM TABLE USING JOINS
WITH CTE AS (
    SELECT
        S.NAME,
        CO.CRS_NAME,
        CO.CRS_CODE,
        CR.MARKS,
        S.ROLLNO
    FROM
        STUDENTS S
        JOIN CRS_REGD CR ON ( S.ROLLNO = CR.CRS_ROLLNO )
        JOIN CRS_OFFRD CO ON ( CR.CRS_CD = CO.CRS_CODE )
    WHERE
        CO.CRS_NAME IN (
            'CS103',
            'CS106'
        )
)
-- ACTUAL LOGIC START FROM HERE
SELECT
    S.NAME,
    CO.CRS_NAME,
    CR.MARKS
FROM
    CTE C3
WHERE
    C3.ROLLNO IN (
        SELECT
            C2.ROLLNO
        FROM
            CTE C1
            JOIN CTE C2 ON ( C1.ROLLNO = 92005102
                             AND C1.ROLLNO <> C2.ROLLNO
                             AND C1.CRS_CODE = C2.CRS_CODE )
        GROUP BY
            C2.ROLLNO
        HAVING ( MAX(CASE
            WHEN C1.CRS_NAME = 'CS103'
                 AND C2.MARKS >= C1.MARKS THEN 1
        END) = 1
                 AND MAX(CASE
            WHEN C1.CRS_NAME = 'CS106'
                 AND C2.MARKS >= C1.MARKS THEN 1
        END) = 1 )
    );

干杯

实现这一点的方法可能有很多。其中之一是:

select
  crs_rollno,
  max(case when crs_cd = 'CS103' then marks end) as marks103,
  max(case when crs_cd = 'CS106' then marks end) as marks106
from crs_regd cr
where crs_cd in ('CS103', 'CS106')
and marks >
(
  select marks
  from crs_regd cr92005102
  where cr92005102.crs_rollno = 92005102 -- student 92005102
    and cr92005102.crs_cd = cr.crs_cd -- same class
)
group by crs_rollno
having count(*) = 2 /* both courses better than 92005102 */ ;
您可以加入学生表以获取他们的姓名

只是为了好玩,另一种方法是:

with cs103 as (select * from crs_regd where crs_cd = 'CS103')
   , cs106 as (select * from crs_regd where crs_cd = 'CS106')
select crs_rollno, cs103.marks as cs103_marks, cs106.marks as cs106_marks
from cs103 join cs106 using (crs_rollno)
where cs103.marks > (select marks from cs103 where crs_rollno = 92005102)
  and cs106.marks > (select marks from cs106 where crs_rollno = 92005102);

学生92005102有CS103和CS106科目,您正在寻找所有也有这些课程并且在这两门课程中都优于学生92005102的学生?是的,这就是问题@ThorstenKettner
with cs103 as (select * from crs_regd where crs_cd = 'CS103')
   , cs106 as (select * from crs_regd where crs_cd = 'CS106')
select crs_rollno, cs103.marks as cs103_marks, cs106.marks as cs106_marks
from cs103 join cs106 using (crs_rollno)
where cs103.marks > (select marks from cs103 where crs_rollno = 92005102)
  and cs106.marks > (select marks from cs106 where crs_rollno = 92005102);