2013-02-26 142 views
1

我是SQL新手,這是我第一次嘗試轉換爲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)) 

任何人都可以幫助我弄清楚如何f它呢?

+2

你試過運行它嗎?你會得到什麼錯誤? (除了JOINs將會是正確的方法之外,我目前沒有看到沒有錯誤信息的問題......) – ppeterka 2013-02-26 12:51:27

+0

沒有錯誤,只是空表....並且有一個元組應該是顯示,但我只是得到一個空表 – JLA 2013-02-26 12:53:59

+0

您可以請提供樣品表數據和預期的輸出 – 2013-02-26 15:12:58

回答

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) 

我已刪除已創建

+0

它只是給我錯誤 – JLA 2013-02-26 13:02:11

+0

Pl發佈錯誤... – Meherzad 2013-02-26 13:05:58

+0

刪除','檢查編輯。 – Meherzad 2013-02-26 13:08:05

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 
+0

@@ Sachin Kainth - 請使用正確的語法。您的示例無效。這絕不會在Oracle中編譯,並可能會讓用戶感到困惑......這僅僅是關於語法,而不是代碼。 – Art 2013-02-26 15:05:17

+0

@藝術,對不起,我認爲它是SQL Server。直到後來我才意識到這是針對Oracle的。在SQL Server中,這兩個編譯和功能。也許你可以這樣使用Oracle語法。 – 2013-02-26 15:58:04