【发布时间】:2015-12-09 19:48:47
【问题描述】:
sql 表如下:likes 列有drinker 和 beer,sells 有 bar 和 beer 列,frequents 有drinker 和 bar 列。
我之前回答过以下说法:
"Drinkers who frequent bars which serve some beer they like"
使用 SQL 查询:
SELECT DISTINCT y.drinker
FROM likes a, sells, frequents y
WHERE a.beer = sells.beer
AND sells.bar = y.bar
AND y.drinker = a.drinker;
现在,我正在尝试修改上面列出的查询以回答类似但不同的陈述:
"Drinkers who only frequent bars which serve beers they like"
从逻辑上讲,修改是只包括那些经常光顾提供他们喜欢的啤酒的酒吧的人,并消除那些光顾不提供他们喜欢的啤酒的酒吧的人。
我最难修改上述查询以满足第二个语句。
我的思考过程可能是进行双重否定,例如:获取以下组中不存在的饮酒者列表:不经常光顾不出售他们喜欢的啤酒的酒吧的饮酒者。但是正确的实现却让我望而却步。
这是我解决此查询的最佳尝试,但我很清楚这是不正确的,因为此查询仍然返回经常光顾某些酒吧(不仅)提供他们喜欢的啤酒的饮酒者:
SELECT distinct x.drinker
FROM frequents x
WHEREexists (SELECT*
FROM frequents y, sells z, likes u
WHERE x.drinker=y.drinker
AND y.bar = z.bar and z.beer = u.beer
AND y.drinker = u.drinker);
任何帮助都会很棒,感谢您提供的任何见解。
【问题讨论】:
-
不确定这是否与课堂练习有关。尽管我可以将其想象为数据库课程的一部分,但我不会将其完全称为初学者问题。我曾与许多难以解决此问题的 SQL 开发人员合作过。