2016-11-14 61 views
1

我已經得到了下面的表格用了不到兩次:SQL:刪除的東西,是在其他表

  • 員工(#PNo,姓名,* A號,工資)
  • 部(# A號,AName)
  • 酒店(#HNo,HName,HCategory,ZIP,市)
  • 之旅(#*員工,#*酒店,#BeginningDate,時間,成本)

(#=主鍵,* =外鍵)

我想刪除已被預訂一空,最多一個支柱,並試圖所有酒店

DELETE hotel FROM hotel 
INNER JOIN journey ON journey.Hotel = hotel.HNo 
WHERE COUNT(journey.Hotel) < 2; 

但是,這並不工作。我得到的是以下錯誤:

"#1111 - Invalid use of group function"

如何我可以連接兩個表並刪除酒店在沒有預訂比1多表「酒店」?

+0

你使用的是MySQL還是MS SQL Server? (不要標記不涉及的產品。) – jarlh

+0

請不要使用您未使用的數據庫標籤。請僅添加您正在使用的數據庫的標籤。 –

+0

我正在使用MySQL 對不起,我是SQL新手,因此我不擅長它。 – mhns

回答

1

使用LEFT JOIN與旅程加盟酒店和計數任何列從旅程表。這將返回酒店+旅程計數,包括沒有旅程的酒店。

DELETE FROM hotel 
WHERE HNo IN (SELECT * FROM (
    SELECT hotel.HNo 
    FROM hotel 
    LEFT JOIN journey ON hotel.HNo = journey.Hotel 
    GROUP BY hotel.HNo 
    HAVING COUNT(journey.Hotel) < 2 
) AS foobar) 

子子查詢技巧是described here

+0

試過這個,現在我得到以下錯誤: 「#1093 - 表'酒店'被指定兩次,既作爲'DELETE'的目標,也作爲數據的獨立源」 – mhns

+0

MySQL有其自己的規則。看修改後的答案。 –

+0

非常感謝。 – mhns

4

ANSI SQL投訴回答:

DELETE hotel FROM hotel 
WHERE HNo not in (select Hotel 
        from journey 
        group by Hotel 
        having count(*) >= 2) 

子查詢將返回存在不止一次在旅程表酒店。

+0

也許對爲什麼連接不會給出預期結果發表評論。 +1 –

+0

@TimBiegeleisen,我無法弄清楚它會怎樣,因爲我不明白DELETE JOIN的語法是什麼 – jarlh

+0

它不會刪除旅途中根本不存在的酒店。 –

1

試試這個

DELETE FROM hotel 
WHERE HNo IN (SELECT hotel.HNo 
       FROM hotel 
       JOIN journey on (journey.hotel = hotel.HNo) 
       GROUP BY hotel.HNo 
       HAVING count(hotel.HNo) < 2) 
0

DELETE FROM酒店,SECNUM IN(SELECT SECNUM FROM旅程GROUP BY SECNUM HAVING COUNT(*)> 2)