我想将一个没有in子句的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)形式 两者在逻辑上是等价的。
答案 0 :(得分:0)
你所描述的是WHERE NOT EXISTS(subquery)
http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html
请告诉我这不是你想要的。
为什么你不改变你的陈述的逻辑来从
饮酒者不在(喝酒)到哪里(饮酒者=无效)
INITIAL QUERY ..格式化,因此更容易阅读
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
。
答案 1 :(得分:0)
您的查询与我的朋友的内部查询相同,因为您说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 ,它会帮助你改善它。
答案 2 :(得分:0)
我将查询重写为存在位置和不存在位置,现在很容易将其转换为关系演算。答案是
{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)))}
无论如何感谢输入。