2016-01-06 97 views
0

我對此查詢有問題,因爲它刪除了所選CNP的所有行,我只能刪除Nume_Excursie='Vacanta1'中的那一行。SQL Server上的查詢執行有誤

當我運行沒有第一行的查詢時,它只查找一行,但是當我運行整個查詢時,它刪除了所有的行,我真的不知道爲什麼。

  • 客戶端(ID_Client,CNP,日期,...)
  • 期(ID,ID_Client,ID_Excursie,..)
  • Excursie(ID_Excursie,Nume_Excursie,..)

enter image description here

delete from perioada 
where 
    Perioada.ID_Client = 
     (select distinct p.ID_Client 
     from Perioada p 
     join Client c on p.ID_Client = c.ID_Client 
     where (c.CNP = 'xxxxx..' 
      and p.ID_Excursie = (select e.id_excursie 
           from Excursie e 
           where e.Nume_Excursie = 'Vacanta1'))) 
+0

你爲什麼要從perioada中刪除並在ID_Client上進行匹配而不是在ID_Perioda上進行匹配? ID_Client不是唯一的(你的鏈接顯示兩行的值都是3),但是它們的ID_Perioda是唯一的。 – wentimo

+0

ID_Client(客戶端中唯一 - 主鍵)是Perioada中的外鍵。在接口中,我只能使用CNP和Name_Excursie。這就是我以這種方式編寫查詢的原因。 – lx23

回答

0

糾正我,如果我錯了這裏,但它看起來像時代是一個一對多的客戶端與數據庫中,因此將有MULT每個時期的客戶端數量;考慮到這個事實,你甚至需要查詢客戶表嗎?

您還需要使用它的主鍵ID_Period從Period中刪除,因爲它在Period表中沒有區別,所以不在它的Client FK上。下面是一些SQL我扔在一起,試圖做到這一點:

DELETE FROM Period 
WHERE Id_period = 
(
    SELECT Id_Period 
    FROM Period p 
    JOIN Excursie e on p.ID_Excursie = e.Id_excursie 
    WHERE e.Nume_Excursie = 'Vacanta1' 
) 

如果客戶的限制是「XXXXX ..」是必需的,我們現在可以只修改內側選擇。

DELETE FROM Period 
WHERE Id_period = 
(
    SELECT Id_Period 
    FROM Perioad p 
    JOIN Excursie e on p.ID_Excursie = e.Id_excursie 
    JOIN Client c on c.ID_Client = p.ID_Client 
    WHERE e.Nume_Excursie = 'Vacanta1' 
    AND c.CNP = 'xxxxx..' 
) 
+0

Excursie與客戶的期限是多對多的。 Period與客戶是一對多的。 – lx23

+0

重新閱讀您的編輯之後,我相信第二個答案應該適合您的目的,請告訴我是否有任何問題 – wentimo

+0

它的工作原理!非常感謝! – lx23