Представлять подзапрос в реляционной алгебре

StackOverflow https://stackoverflow.com/questions/3850816

  •  27-09-2019
  •  | 
  •  

Вопрос

Как я могу представлять подзапрос в отношении алгебры? Я положил новый выбор под предыдущий выход выбора?

SELECT number
FROM collection
WHERE number = (SELECT anotherNumber FROM anotherStack);
Это было полезно?

Решение

Вы бы просто переписали это как join.

Я не уверен, насколько широко используются синтаксис, который я узнал для реляционной алгебры, настолько в словах.

  1. Проводить проекцию anotherNumber от anotherStack
  2. Переименовать anotherNumber из результата шага 1 как number
  3. Естественный присоединяйся к результату шага 2 на collection
  4. Принять окончательную проекцию number из результата шага 3

Другие советы

Ответ зависит от того, на каких операторах вашей алгебры состоит. Оператор полуприсоединения был бы наиболее полезным здесь.

Если общий атрибут был назван number В обоих отношениях тогда это будет полусоединение, а затем проекция number. Отказ Предполагая, что оператор SEM-join по имени MATCHING, согласно Учебник D.:

( collection MATCHING anotherStack ) { number }

Как указано, атрибут должен быть переименован в первую очередь:

( collection MATCHING ( anotherStack RENAME { anotherNumber AS number } ) { number }

Если стандартный SQL'S (SQL-92) JOIN Можно считать, слабо говоря, реляционный оператор, то это правда, что SQL нет, нет полуприсоединения. Однако он имеет несколько предикатов сравнения, которые могут быть использованы для записи оператора полуприсоединения, например, MATCH:

SELECT number
  FROM collection
 WHERE MATCH (
              SELECT * 
                FROM collection
               WHERE collection.number = anotherNumber.anotherStack
             );

Однако, MATCH не широко поддерживается в реальной жизни продуктов SQL, следовательно, почему полуприсоединение обычно написано, используя IN (subquery) или EXISTS (subquery) (И я подозреваю, что именно поэтому вы называете проверенные «подзапрос» на вашем вопросе, т. Е. Термин полуприсоединения не очень хорошо известен среди практикующих SQL).


Еще один подход будет использоваться оператор пересекающегося в случае доступности.

Что-то вроде (псевдокод):

( collection project number ) 
intersect 
( ( anotherStack rename anotherNumber as number ) project number )

В SQL:

SELECT number
  FROM collection
INTERSECT
SELECT anotherNumber
  FROM anotherStack;

Это довольно хорошо поддерживается в реальной жизни (SQL Server, Oracle, PostgreSQL и т. Д., Но в частности не MySQL).

В соответствии с это PDF, вы можете легко преобразовать подпросию к реляционному алгебрическому выражению.

Во-первых, вы должны преобразовать весь запрос из формы

SELECT Select-list FROM R1 T1, R2 T2, ...
WHERE
some-column = (
    SELECT some-column-from-sub-query from r1 t1, r2 t2, ...
    WHERE extra-where-clause-if-needed)

к

SELECT Select-list FROM R1 T1, R2 T2, ...
WHERE
EXISTS (
    SELECT some-column-from-sub-query from r1 t1, r2 t2, ...
    WHERE extra-where-clause-if-needed and some-column = some-column-from-sub-query)

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

PI[some-column-from-sub-query](
    SIGMA[extra-where-clause-if-needed 
        ^ some-column = some-column-from-sub-query
        ](RO[T1](R1) x RO[T2](R2) x ... x RO[t1](r1) x RO[t2](r2) x ...)
)

Здесь R1, R2... являются контекстными отношениями, а также r1, r2... являются подпрострами отношения.

Как синтаксис довольно катастрофа в переполнении стека, пожалуйста, перейдите к тот PDF, чтобы получить широкий обзор того, как преобразовать подпроси в отношении реляционной алгебры.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top