Ответ 1
Каждая базовая таблица имеет шаблон оператора, aka predicate, параметризованный именами столбцов, по которым мы помещаем строку или оставляем ее. Мы можем использовать сокращенное выражение для предиката, похожее на его объявление SQL.
// facilitator [facilID] is named [facilFname] [facilLname]
facilitator(facilID,facilLname,facilFname)
// class [classID] named [className] has prime [primeFacil] & backup [secondFacil]
class(classID,className,primeFacil,secondFacil)
Включение строки в предикат дает утверждение aka. Строки, которые делают истинное предложение, идут в таблицу, а строки, которые делают ложное предложение, остаются в силе. (Таким образом, таблица утверждает предложение каждой текущей строки и не указывает на предложение каждой отсутствующей строки.)
// facilitator f1 is named Jane Doe
facilitator(f1,'Jane','Doe')
// class c1 named CSC101 has prime f1 & backup f8
class(c1,'CSC101',f1,f8)
Но каждое значение выражения таблицы имеет предикат в своем выражении. SQL сконструирован так, что если таблицы T
и U
содержат (NULL-свободные не дубликаты) строки, где T (...) и U (...) (соответственно), то:
-
T CROSS JOIN U
содержит строки, где T (...) AND U (...) -
T INNER JOIN U ON
condition
содержит строки, где T (...) AND U (...) AND condition -
T LEFT JOIN U ON
condition
содержит строки где (для U-единственных столбцов U1,...)
T (...) И U (...) И условие OR T (...) AND NOT (U (...) AND condition) И U1 IS NULL AND... -
T WHERE
condition
содержит строки, где T (...) AND condition -
T INTERSECT U
содержит строки, где T (...) AND U (...) -
T UNION U
содержит строки, где T (...) OR U (...) -
T EXCEPT U
содержит строки, где T (...) AND NOT U (...) -
SELECT DISTINCT * FROM T
содержит строки, где T (...) -
SELECT DISTINCT
columns to keep
FROM T
содержит строки, где СУЩЕСТВУЕТ СУЩЕСТВУЮЩИЕ столбцы, ТАК ЧТО Т (...) -
VALUES (C1, C2, ...)((
v1
,
v2
, ...), ...)
содержит строки, где C1 = v1 AND C2 = v2 AND... OR...
также:
-
(...) IN T
означает T (...) -
scalar
= T
означает T (скалярный) - T (..., X,...) И X = Y означает T (..., Y,...) И X = Y
Таким образом, для запроса мы находим способ формулировки предиката для строк, которые мы хотим на естественном языке, с использованием предикатов базовой таблицы, затем в сокращении с использованием предикатов базовой таблицы, а затем в SQL с использованием имен базовых таблиц (плюс условия, где это необходимо). Если нам нужно дважды упомянуть таблицу, мы дадим ей псевдонимы.
// natural language
THERE EXISTS classID,primeFacil,secondFacil SUCH THAT
class [classID] named [className] has prime [primeFacil] & backup [secondFacil]
AND facilitator [primeFacil] is named [pf.facilFname] [pf.facilLname]
AND facilitator [secondFacil] is named [sf.facilFname] [sf.facilLname]
// shorthand
THERE EXISTS classID,primeFacil,secondFacil SUCH THAT
class(classID,className,primeFacil,secondFacil)
AND facilitator(pf.facilID,pf.facilLname,pf.facilFname)
AND pf.facilID = primeFacil
AND facilitator(sf.facilID,sf.facilLname,sf.facilFname)
AND sf.facilID = secondFacil
// table names & (MS Access) SQL
SELECT className,pf.facilLname,pf.facilFname,sf.facilLname,sf.facilFname
FROM (class JOIN facilitator AS pf ON pf.facilID = primeFacil)
JOIN facilitator AS sf ON sf.facilID = secondFacil
OUTER JOIN будет использоваться, когда класс не всегда имеет обоих фасилитаторов, или что-то не всегда имеет все имена. (Т.е. если столбец может быть NULL.) Но вы не указали конкретные предикаты для вашей базовой таблицы и запроса или бизнес-правил, когда вещи могут быть NULL, поэтому я не принял NULL.