1

私は SQL が初めてで、この種のステートメントを SQL に変換するのはこれが初めての試みです。

ジョン・スミスが好きなビールを提供するすべてのバーに通う酒飲みを見つけます

そして、それに答えるために次の3つの表があります。

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 に答える