Как реализовать SQL "где не в" в корреляционном исчислении?

Я хочу преобразовать SQL-запрос, который имеет условие "где не в", в кортеж реляционного исчисления. Экзистенциальный и универсальный квантификатор реализует только то, где существует, а где не существует предложение, поэтому я хочу знать, как реализовать, где не в?

Мои столы serves(bar,beer),frequents(drinker,bar),likes(drinker,beer)Следующий запрос выбирает тех, кто пьет только те бары, в которых подают пиво, которое им нравится.

select distinct f2.drinker from frequents f2 where f2.drinker not in (select f1.drinker from frequents f1 where (f1.bar,f1.drinker) not in (select f.bar,f.drinker from frequents f,serves s,likes l where l.beer=s.beer and f.bar=s.bar and f.drinker=l.drinker))

Достаточно, если кто-то может объяснить мне, как реализовать, где нет в TRC, нет необходимости конвертировать весь запрос. Я использую http://www-rohan.sdsu.edu/~eckberg/relationalcalculusemulator.html
проверить мое реляционное исчисление и преобразовать его в SQL-запрос.

Замечания:

Если вы используете значения в вашем запросе.

Он не поддерживает импликацию. Например, импликация может быть реализована следующим образом.(P ==>q) может быть записана в виде (не p или q), поскольку оба логически эквивалентны.

3 ответа

Решение

Я переписал свой запрос с тем, где существует, а где нет, и теперь его легко преобразовать в реляционное исчисление. Ответ

{T.drinker|∃f2Єfrequents (∀f1Єfrequents (∃fЄfrequents(∃sЄserves ∃lЄlikes(s.beer=l.beer^l.drinker=f.drinker^s.bar=f.bar^f1.drinker=f.drinker^f.bar=f1.bar^f2.bar=f1.bar v f2.drinker≠f1.drinker)))}

В любом случае спасибо за вклад.

Хорошо, что вы описываете WHERE NOT EXISTS(subquery)

http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html

дайте мне знать, если это не то, что вы хотите.


Кроме того, почему бы вам просто не изменить логику вашего заявления, чтобы перейти от

ГДЕ ПИТАТЕЛЬ НЕ ВХОДЯТ (пьяница), ГДЕ ГДЕ (пьющий = ноль)

НАЧАЛЬНЫЙ ЗАПРОС.. отформатирован, чтобы его было легче читать

SELECT 
    DISTINCT f2.drinker 
FROM frequents f2 
WHERE f2.drinker NOT IN 
    (
        SELECT 
            f1.drinker 
        FROM frequents f1 
        WHERE (f1.bar,f1.drinker) NOT IN 
        (
            SELECT 
                f.bar,
                f.drinker 
            FROM frequents f,
                serves s,
                likes l 
            WHERE l.beer=s.beer AND f.bar=s.bar AND f.drinker=l.drinker
        )
    )

что вы должны быть в состоянии сделать это

SELECT 
    DISTINCT f2.drinker 
FROM frequents f2 
WHERE f2.drinker IN 
    (
        SELECT 
            f1.drinker 
        FROM frequents f1 
        WHERE f1.drinker IS NULL AND (f1.bar,f1.drinker) IN 
        (
            SELECT 
                f.bar,
                f.drinker 
            FROM frequents f,
                serves s,
                likes l 
            WHERE l.beer=s.beer AND f.bar=s.bar AND f.drinker=l.drinker AND f.drinker IS NULL
        )
    )

надеюсь, это работает, я не могу проверить это. но идея вместо того, чтобы сказать where this is not in this сказать where this is in this where id (in subquery) is null,

Ваш запрос равен вашему внутреннему запросу, мой друг, потому что вы сказали f2 это то, что не в f1 а также f1 это то, что не в f и все они получили один источник frequents а это значит f2=f и ваш запрос возвращает это:

select f.bar,f.drinker from frequents f,serves s,likes l 
where l.beer=s.beer and f.bar=s.bar and f.drinker=l.drinker;

но я думаю, что этот запрос может дать вам лучшие результаты, мой друг:

select f.bar,f.drinker from frequents f 
left outer join serves s on  f.bar=s.bar 
left outer join likes l on l.beer=s.beer and f.drinker=l.drinker;

Посмотрите на SQL Fiddle, это поможет вам улучшить его.

Другие вопросы по тегам