1

我是 SQL 新手,这是我第一次尝试将这种语句转换为 SQL。

找到经常光顾所有供应约翰史密斯喜欢的啤酒的酒吧的饮酒者

我有以下三个表格来回答它:

FREQUENTS(DRINKER, BAR) 
SERVES(BAR, BEER) 
LIKES(DRINKER, BEER)

这是我不成功的方法:

SELECT DISTINCT F1.DRINKER
FROM FREQUENTS F1
WHERE F1.DRINKER<>'John Smith'
AND   F1.DRINKER NOT IN(SELECT F2.DRINKER
                        FROM FREQUENTS F2
                    WHERE F2.BAR NOT IN (SELECT S.BAR 
                                        FROM SERVES S, LIKES L
                                        WHERE L.DRINKER='John Smith'
                                        AND S.BEER=L.BEER
                                        AND L.DRINKER=F2.DRINKER))

谁能帮我弄清楚如何解决它?

4

2 回答 2

1

试试这个查询

SELECT DISTINCT F1.DRINKER
FROM FREQUENTS F1 
WHERE F1.BAR IN (SELECT S.BAR FROM SERVES S, LIKES L
                                    WHERE L.DRINKER='John Smith'
                                    AND S.BEER=L.BEER)

我已删除您创建的额外子查询

于 2013-02-26T12:56:31.930 回答
0

好,我知道了。它不是很优雅,如果在执行此代码期间数据得到更新,那么这可能不起作用,但在这里

DECLARE @bars TABLE (bar nvarchar(max))
DECLARE @drinkers TABLE (drinker nvarchar(max))
DECLARE @drinkerCounts TABLE (count int, drinker nvarchar(max))
DECLARE @barCount int

insert into @bars
select distinct bar from serves where beer in
(select beer from likes where drinker = 'John Smith')

select @barCount = COUNT(*) from @bars

insert into @drinkers
select drinker from frequents f
inner join @bars b on f.bar = b.bar
where drinker <> 'John Smith'

insert into @drinkerCounts
select count(drinker), drinker
from @drinkers
group by drinker

select * from @drinkerCounts dc
where dc.Count = @barCount
于 2013-02-26T13:43:57.083 回答