2015-03-18 2 views
2

Я пытаюсь изучить реляционные языки запросов и SQL, а приведенный ниже пример действительно меня смущает. Не могли бы вы помочь объяснить, где я должен начать анализ этих вложенных NOT EXIST (самый внешний?) И что каждый из них делает? Спасибо огромное!Вложенный NOT EXIST в SQL

Примечание: Это всего лишь пример, а не приложение для реального мира.

считает директор {имя, кино} и актер {имя, кино, роль}

SELECT 
    d1.name 
FROM 
    Director d1 
WHERE NOT EXISTS (SELECT d2.movie 
        FROM Director d2 
        WHERE d2.name = d1.name 
        AND NOT EXISTS(SELECT a1.role 
            FROM Actor a1 
            WHERE a1.name = d2.name 
            AND a1.movie = d2.movie 
            AND NOT EXISTS(SELECT a2.role 
                FROM Actor a2 
                WHERE a2.role ̸= a1.role 
                AND a2.movie = a1.movie 
                AND a2.name= a1.name 
                ) 
           ) 
       ) 
+1

Я чувствую себя немного похожей на задницу, указывающей на это, но я получил довольно длинное объяснение такого рода запросов здесь: http://stackoverflow.com/questions/29012455/find-the-s-of-the-Suppl-who-supply-every-part/29013311 # 29013311 –

ответ

1

Это выглядит как продолжение одного из составов для relational division, в частности разделения-с-остатком ,

This article от Joe Celko имеет довольно исчерпывающее объяснение концепции и различных способов ее реализации.

This fiddle должно дать вам больше информации о том, что происходит.

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

Вы ищете имя режиссера для фильма, где нет фильма для того же режиссера, где роль этого режиссера не играет роль, а не для той же роли одного и того же режиссера.

Трудно приготовить это, но, насколько я могу судить, это сводится к желанию названия режиссера для всех фильмов, где режиссер выступал в роли актера в фильме только в одной роли.

+0

Большое спасибо! Не могли бы вы немного подробнее рассказать о том, как работает второй NOT EXIST «WHERE d2.name = d1.name AND NOT EXISTS», «где нет роли, которую играет этот директор»? И зачем использовать d1 и d2? – user3735871

+0

Насколько я понял, в 'SELECT d2.movie FROM Director d2 ГДЕ d2.name = d1.name И НЕ СУЩЕСТВУЕТ ( SELECT a1.role FROM Актер a1 ГДЕ a1.name = d2.name И a1 .movie = d2.movie ', THE NOT EXIST исключает режиссеров, которые играли там фильмы? – user3735871

1

Работайте с самым глубоким вложенным запросом на самый внешний уровень. Понимая уровень, замените его простым английским описанием. Например, самый внутренний уровень в вашем запросе выше можно описать следующим образом: «Тот же фильм, тот же актер, другая роль», или «у актера есть более чем одна роль в фильме». Работа вовне, НЕ СУЩЕСТВУЕТ, дает нам «актер не имеет более одной роли в фильме». Объедините это с предложением WHERE, и мы получим «актер - режиссер фильма, и у актера не более одной роли в фильме». Просто продолжайте делать это до тех пор, пока не достигнете верхнего уровня ...

+0

Спасибо, не могли бы вы объяснить немного больше?? И тогда, что мы получим, когда совмещаем« актер - режиссер фильма И актер не имеет более одной роли в фильме ». с« WHERE d2.name = d1.name И NOT EXISTS() »? Также я не совсем понимаю, почему он использует d1 и d2. – user3735871

+0

d1 и d2 являются «self-join». Это позволяет общему запросу получать две разные строки из одной таблицы. Это действительно то же самое, что и «актер с несколькими ролями», но для режиссера. –

Смежные вопросы