如何在元组关系演算中实现sql“where in not”?

时间:2014-03-10 04:16:01

标签: mysql sql tuples tuple-relational-calculus

我想将一个没有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)形式   两者在逻辑上是等价的。

3 个答案:

答案 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 thiswhere 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)))}

无论如何感谢输入。