Как реализовать 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, это поможет вам улучшить его.