Поиск, существует ли строка в подзапросе

Спойлер: я довольно новичок в Oracle.
У меня есть четыре таблицы: зачисления, курсы / разделы, стандарты и оценки.

Мы работаем с Honor Roll. У меня есть запросы к первым трем таблицам, которые добавляют различные ограничения, необходимые для удовлетворения требований проверки чести. Затем мы смотрим на таблицу оценок. Если у них есть действительное зачисление на действительный курс, соответствующий действующим стандартам, подсчитайте их баллы. Если их количество кол-во соответствует порогам, тогда они получают награды.

Этот код не оптимизирован, и, скорее всего, его можно сделать гораздо лучше / более компактно, но я уверен, что он запускается всего несколько раз в год, поэтому я готов отказаться от оптимизации, чтобы увеличить удобочитаемость человека, так что я могу продолжать изучать основы. Пока что у меня есть:

WITH validCC (SELECT CC.ID AS CCID,
    CC.STUDENTID AS STUDENTID, 
    CC.SECTIONID AS SECTIONID, 
    CC.TERMID AS TERMID, 
    STUDENTS.DCID AS STUDENTSDCID
FROM CC
    INNER JOIN STUDENTS ON CC.STUDENTID = STUDENTS.ID
WHERE TERMID in (2700,2701)
    AND CC.SCHOOLID = 406;
),  --end validCC

validCrsSect (SELECT SECTIONS.ID AS SECTIONID,
    SECTIONS.DCID AS SECTIONSDCID,
    SECTIONS.EXCLUDEFROMHONORROLL AS SECTHR,
    COURSES.COURSE_NUMBER AS COURSE_NUMBER,
    COURSES.COURSE_NAME AS COURSE_NAME,
    COURSES.EXCLUDEFROMHONORROLL AS CRSHR
FROM SECTIONS
    INNER JOIN COURSES ON SECTIONS.COURSE_NUMBER = COURSES.COURSE_NUMBER AND SECTIONS.SCHOOLID = COURSES.SCHOOLID
WHERE SECTIONS.TERMID IN (2700,2701)
    AND SECTIONS.SCHOOLID = 406
    AND SECTIONS.EXCLUDEFROMHONORROLL = 0
    AND COURSES.EXCLUDEFROMHONORROLL = 0
), --end validCrsSect

validStandard (SELECT STANDARDID,
    IDENTIFIER,
    TRANSIENTCOURSELIST
FROM STANDARD
WHERE isActive = 1
    AND YEARID = 27
    AND ( instr (STANDARD.identifier, 'MHS.TS', 1 ,1) > 0     --Is a valid standard for this criteria:  MHS TS
        or STANDARD.identifier = 'MHTC.TS.2'                  --or MHTC TS
        or STANDARD.identifier = 'MHTC.TS.4'  )
), --end validStandard

--sgsWithChecks ( 
SELECT sgs.STANDARDGRADESECTIONID AS SGSID,
    sgs.STUDENTSDCID as STUDENTSDCID,
    sgs.STANDARDID AS STANDARDID,
    sgs.STORECODE AS STORECODE,
    sgs.SECTIONSDCID AS SECTIONSDCID,
    sgs.YEARID AS YEARID,
    sgs.STANDARDGRADE AS STANDARDGRADE,
    (select count(CCID) from validCC INNER JOIN STANDARDGRADESECTION sgs ON sgs.STUDENTSDCID = validCC.STUDENTSDCID and sgs.SECTIONSDCID = validCC.SECTIONID) as CC_OK,
    (select count(SECTIONID) from validCrsSection  INNER JOIN STANDARDGRADESECTION sgs ON  sgs.SECTIONSDCID = validCrsSect.SECTIONSDCID) AS CRS_OK,
    (select count(STANDARDID) from validStandard  INNER JOIN STANDARDGRADESECTION sgs ON  sgs.STANDARDID = validStandard.STANDARDID) AS STD_OK
FROM STANDARDGRADESECTION sgs

Цель помещения столбцов "ОК" в таблицу vGrades заключается в том, что окончательный результат SELECT (не входит в комплект) проходит и подсчитывает случаи фильтрации определенных результатов по проверкам.

К сожалению, в таблице учеников и в таблице разделов есть два идентификатора (и это не одни и те же данные). Поэтому, когда я иду связать все, некоторые таблицы используют ID в качестве FK, другие используют DCID в качестве FK; и я должен вытянуть дополнительную таблицу, чтобы сделать это преобразование. Думаю, это делает соединения более увлекательными.

Каждый отдельный запрос работает сам по себе, но я не могу получить окончательный выбор счетчика () для получения своих данных. Я попытался встроить первоначальные запросы в качестве подзапросов, но не смог передать в них студента, и он выполнял этот запрос для каждого учащегося, а не один раз в начале.

Моя текущая ошибка:

Error starting at line : 13 in command -
    SECTIONS.DCID AS SECTIONSDCID,
Error report -
Unknown Command

Однако прежде он говорил неизвестную таблицу и ссылался на последнюю строку оператора соединения. Все имена таблиц действительны. Мысли?

2 ответа

Решение

Я заменил ВНУТРЕННЕЕ СОЕДИНЕНИЕ с простым условием ГДЕ. Это похоже на работу.

(SELECT COUNT (CCID) FROM validCC WHERE sgs.STUDENTSDCID = validCC.STUDENTSDCID and sgs.SECTIONSDCID = validCC.SECTIONID) as CC_OK,
(SELECT COUNT (SECTIONID) FROM validCrsSect WHERE sgs.SECTIONSDCID = validCrsSect.SECTIONSDCID) AS CRS_OK,
(SELECT COUNT (STANDARDID) FROM validStandard WHERE sgs.STANDARDID = validStandard.STANDARDID) AS STD_OK

Я удалил случайную запятую в конце validStandard и заменил from validCrsSection с from validCrsSect (при условии, что это означало WITH пункт, и нет другого validCrsSection Таблица). Я также предполагаю, что счетчики должны быть привязаны к текущему sgs строка, а не счетчики всей таблицы. Я делаю это так:

with validcc as
     ( select cc.id as ccid
            , cc.studentid
            , cc.sectionid
            , cc.termid
            , st.dcid as studentsdcid
       from   cc
              join students st on st.id = cc.studentid
       where  cc.termid in (2700, 2701)
       and    cc.schoolid = 406
     )
   , validcrssect as
     ( select s.id as sectionid
            , s.dcid as sectionsdcid
            , s.excludefromhonorroll as secthr
            , c.course_number
            , c.course_name
            , c.excludefromhonorroll  as crshr
       from   sections s
              join courses c
                   on  c.course_number = s.course_number
                   and c.schoolid = s.schoolid
       where  s.termid in (2700, 2701)
       and    s.schoolid = 406
       and    s.excludefromhonorroll = 0
       and    c.excludefromhonorroll = 0
     )
   , validstandard as
      ( select standardid
             , identifier
             , transientcourselist
        from   standard
        where  isactive = 1
        and    yearid = 27
        and    (   instr(standard.identifier, 'MHS.TS', 1, 1) > 0
                or standard.identifier in ('MHTC.TS.2','MHTC.TS.4') )
     )
select sgs.standardgradesectionid as sgsid
     , sgs.studentsdcid
     , sgs.standardid
     , sgs.storecode
     , sgs.sectionsdcid
     , sgs.yearid
     , sgs.standardgrade
     , ( select count(*) from validcc
         where  validcc.studentsdcid = sgs.studentsdcid
         and    validcc.sectionid = sgs.sectionsdcid ) as cc_ok
     , ( select count(*) from validcrssect
         where  validcrssect.sectionsdcid = sgs.sectionsdcid ) as crs_ok
     , ( select count(*) from validstandard
         where  validstandard.standardid = sgs.standardid ) as std_ok
from   standardgradesection sgs;

Это работает с шестью табличными определениями, перепроектированными как:

create table students
( id integer not null
, dcid integer );

create table cc
( id integer
, studentid integer
, sectionid integer
, termid integer
, schoolid integer );

create table courses
( course_number integer
, course_name varchar2(30)
, excludefromhonorroll integer
, schoolid integer );

create table sections
( id integer not null
, dcid integer
, excludefromhonorroll integer
, termid integer
, schoolid integer
, course_number integer );

create table standard
( standardid integer
, identifier varchar2(20)
, transientcourselist varchar2(50)
, isactive integer
, yearid integer );

create table standardgradesection
( standardgradesectionid integer
, studentsdcid integer
, standardid integer
, storecode integer
, sectionsdcid integer
, yearid integer
, standardgrade integer );
Другие вопросы по тегам