Для самой простой реляционной алгебры, где отношение имеет атрибут, заданный как заголовок, а кортеж - как тело:
Предположительно идентификаторы квартир в Апартаментах - для квартир, а идентификаторы квартир в Аренде - для арендованных квартир. Тогда не арендованные квартиры - те, что в квартире, но не в аренде. Их идентификаторы в реляционной разнице между проекциями этих отношений.
Гадание по легенде / ключу для вашего ERD, есть FK (внешний ключ) в Rental Rental ссылающейся квартире. Это подтверждает, что квартира в аренду тоже в квартире. Так что Apartment ⨝ Rental
имеет те же квартиры, что и Rental
. Это подтверждает, что вам не нужно присоединяться.
Вот как мы можем запрашивать и рассуждать в более широком смысле, основываясь на значениях строк в таблицах.
Вы упоминаете NULL & EXISTS. Возможно, вы говорите о SQL NULL & EXISTS и / или пытаетесь найти версию SQL-запроса по реляционной алгебре и / или вы рассуждаете в SQL. И / или, может быть, вы говорите о логике EXISTS и о том, существуют ли значения в столбцах или кортежах.
Из здравого смысла об аренде, и если вы не говорите иначе, Rental
- это строки, где occupant O rented apartment A from date F to date T
. Но вы упоминаете NULL. Из здравого смысла и догадки T может быть NULL, Rental
это строки, где occupant O rented apartment A from date F to date T OR occupant O rented apartment A from date F ongoing & T is null
. Подобное условие членства в кортеже - это предикат (характеристика) . Мы не можем обновить или запросить информацию о ситуации в бизнесе, не сказав предикат каждого базового отношения.
NULL - это значение, которое специально обрабатывается операторами и синтаксисом SQL. Мы не знаем, как ваша алгебра и язык относятся к NULL. В математике EXISTS X [p]
& FOR SOME X [p]
говорят, что существует значение, которое мы можем назвать X, удовлетворяющее условию p. SQL EXISTS (R)
говорит, существуют ли строки в таблице R. То есть, EXISTS t [t IN R]
. Когда R - это (X, ...) строк, где r, то есть EXISTS X,... [r]
.
Когда R - строки, где r, π x (R)
- по определению строки, где EXISTS *non-x attributes of R* [r]
. Так π A (Rental)
- это строки, где EXISTS O,F,T [occupant O rented apartment A from date F to date T OR occupant O rented apartment A from date F ongoing & T is null]
.
Когда R - строки, где r, σ p (R)
- по определению строки, где r & p
. Строки, где occupant O rented apartment A from date F ongoing & T is null
- строки, где (occupant O rented apartment A from date F to date T OR occupant O rented apartment A from date F ongoing & T is null) & T is null
, что σ T is null (R)
.
Когда R - строки, где r & S - строки, где s, R - S
- по определению строки, где r & NOT s
. Предположим, Apartment
- это строки, где apartment A has S square feet ...
. Вы хотите строки, где EXISTS S,... [apartment A has S square feet ...] & NOT EXISTS O,F,T [occupant O rented apartment A from date F to date T OR occupant O rented apartment A from date F ongoing & T is null]
. Это разница в начале ответа.
PS
Каждое выражение запроса имеет связанный (характеристический) предикат - шаблон оператора, параметризованный атрибутами. Кортежи, превращающие предикат в истинное утверждение - утверждение - находятся в соотношении.
Нам даны предикаты для выражений, которые являются именами отношений.
Пусть выражение запроса E имеет предикат e. Тогда:
R ⨝ S
имеет предикат / строки, удовлетворяющие r and s
R ∪ S
имеет предикат / есть строки, удовлетворяющие r or s
R - S
имеет предикат / строки, удовлетворяющие r and not s
σ p (R)
имеет предикат / строки, удовлетворяющие r and p
π A (R)
имеет предикат / есть строки, удовлетворяющие exists
attributes of R other than A
[r]
Когда мы хотим, чтобы кортежи удовлетворяли определенному предикату, мы находим способ выразить этот предикат в терминах преобразований операторов отношений заданных предикатов отношений. Соответствующий запрос возвращает / вычисляет кортежи.
Запрос реляционной алгебры.