2017-02-10 63 views
0

表:SQL查詢的問題(正確性檢查)

- 比爾斯(名稱,生產商)
- 酒吧(姓名,地址,許可證)
- 塞爾斯(酒吧,啤酒價格)
- 飲酒(姓名,地址,電話)
- 喜歡(飲酒,啤酒)
- 流連(飲酒,吧)
- 友(drinker1,drinker2)

任務:

  1. 找到所有的啤酒喜歡由兩個或兩個以上的飲酒者
  2. 查找三個或三個以上的飲酒者喜歡所有的啤酒
  3. 查找安娜
  4. 的朋友喜歡所有的啤酒發現銷售啤酒是便宜了吧比杆 「99瓶」

查詢#1銷售的所有啤酒:

SELECT x name 
FROM Beers x, Drinkers y, Likes s  
WHERE y.name=s.drinker and s.beer=x.name 
GROUP BY x.name  
HAVING COUNT(s.drinker) >= 2; 

查詢#2:

同3先前

查詢#。

SELECT x name 
FROM Beers x, Friends y, Drinkers z, Likes p 
WHERE z.name = "Anna" 
    AND z.name = y.drinker1 
    AND y.drinker2 = p.drinker 
    AND p.beer = x.name; 

查詢4:

SELECT x.name 
FROM Bars x, Sells y 
WHERE x.name = y.bar 
    AND SOME(SELECT y.price) < ALL(SELECT t.price 
           FROM Sells t 
           WHERE t.bar = "99 bottles"); 

我對最後一個有點猶豫。我是否允許以這種方式使用SOME?我可以通過在select子句中使用外部變量來創建一個子查詢嗎?

+1

[踢壞的習慣:使用舊式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins。 aspx) - 在ANSI - ** 92 ** SQL標準(** 25年**之前)中將舊式*逗號分隔的表*樣式列表替換爲* proper * ANSI'JOIN'語法不鼓勵使用 –

+0

是的,大家一直告訴我,只要我踩了SQL,但這正是我的老師正在使用的。他告訴我們,我們將在後面的課程中學習這個sintax。 – daniel

回答

1

3.查找安娜的朋友喜歡所有的啤酒:

沒有與你的答案2個主要問題:

  • 查詢可以返還相同啤酒的名字不止一次在某些情況下
  • 你會錯過一些案件,因爲「安娜」可能會出現在好友表任drinker1drinker2

使用顯式JOIN的Here'a樣品溶液:

SELECT x.name 
FROM Beers 
WHERE b.name IN (
    SELECT l.beer 
    FROM Likes l 
     INNER JOIN Friends f 
      ON l.drinker = f.drinker1 
    WHERE f.drinker2 = "Anna" 

    UNION 

    SELECT l.beer 
    FROM Likes l 
     INNER JOIN Friends f 
      ON l.drinker = f.drinker2 
    WHERE f.drinker1 = "Anna" 
) 

4。找到所有出售比由「99瓶」酒吧出售的啤酒便宜的啤酒的酒吧:

您正在使用SOME和ALL不正確;

  • 我們決不使用上比較符的兩個雙方這些關鍵字
  • SOMEALL表達式必須是一個完整的子查詢(SELECT y.price是不是一個有效的表達式)

這裏的樣品溶液使用INMIN

SELECT b.name 
FROM Bars b 
WHERE b.name IN (

    SELECT s.bar 
    FROM Sells s 
    WHERE s.price < 
    (
     SELECT MIN(price) 
     FROM Sells 
     WHERE bar = "99 bottles" 
    ) 

) 
+2

如果你做丹尼爾的作業,他不會學到太多...... – jarlh

+0

你好,謝爾,非常感謝你的回答;然而,我老師使用的sintax是不同的。我知道這已經過時了,但中期是以sintax爲基礎的。他告訴我們最終他會教我們你正在使用的sintax。你能提供關於我工作的反饋嗎? – daniel