2009-09-25 28 views
2

我有三個表如下,沒有級聯關係(我不希望這樣,因爲數據庫主要由NHibernate管理)。刪除結合/連接表引用記錄的方法是什麼?

Invoice 
(
    entity_id int not null, 
    ... 
) 

Ticket 
(
    entity_id int not null, 
    ... 
) 

InvoiceTicket 
(
    InvoiceId --> Not-null foreign key to Invoice.entity_id 
    TicketId --> Not-null Foreign key to Ticket.entity_id 
) 

我想要做的是刪除Ticket上給定條件的發票,票據和相關的InvoiceTicket行。但是我必須在應用程序外部執行此操作,因此爲什麼要構建SQL查詢來執行此操作。

我已經刪除了發票和票據的所有依賴項,沒有問題。由於InvoiceTicket引用了Invoice和Ticket,因此我必須先刪除InvoiceTicket行。但是,如果我這樣做,那麼我與發票表的鏈接就會中斷(我仍然可以刪除感興趣的票據,但不再是發票)。

什麼是使用SQL執行此操作的公認方法?

我已經解決了這個問題,通過使用臨時表並使用InvoiceTicket表中的感興趣的行填充它,但是其他人正在做什麼來解決這類問題?我想你也可以用存儲過程來做到這一點,但我不太熟悉這些。是否有通過SQL查詢執行此操作的直接方式?

+0

您是否需要使用ANSI SQL進行工作,或者您是否有特定的版本? – RBarryYoung 2009-09-25 20:17:17

+0

由於我對接受的方法感興趣,所以應該使用ANSI SQL。 – 2009-09-26 17:59:21

回答

0

如果發票可以在不相關的invoicetickets有效地存在,那麼RBarryYoung的解決方案是廢話。它刪除每個這樣的發票。

在這種情況下,要正確確定要刪除的發票集,您必須先查詢它們並將它們放在一邊。

+0

+1非常好的一點。在這種情況下,發票可以在沒有InvoiceTickets的情況下存在,所以我需要稍微改進我自己的解決方案。 – 2009-09-25 17:18:57

0

您可以將InvoiceTicket中的行放入臨時表中,然後從臨時表中的ID中刪除InvoiceTicket,Ticket和最後的發票。最後吹走臨時桌子。

+0

-1下次請閱讀整個問題。謝謝。 – 2009-09-25 18:45:50

2

嗯,這裏是我會怎麼做:

BEGIN TRANSACTION 
    DELETE FROM InvoiceTicket 
    WHERE EXISTS(
     SELECT * 
     FROM TICKET t 
     WHERE {t.* conditions are met} 
     ) 

    DELETE FROM Ticket 
    WHERE {t.* conditions are met} 

    DELETE FROM Invoice 
    WHERE NOT EXISTS(
     SELECT * 
     FROM InvoiceTicket it 
     WHERE Invoice.entity_id = InvoiceTicket.InvoiceId 
     ) 
COMMIT TRANSACTION 

它已有效地指出,如果發票需要至少一個相關聯的票這種方式(以上)纔有效。雖然這是真實的,但它也引發了一個相反的問題,您是否真的想要刪除與您的匹配票證相關的每張發票?因爲它們也可能與其他未刪除的門票相關聯。

+0

+1得到這個腳本的工作。這裏有趣的思考過程。 – 2009-09-25 15:26:58

0

我不知道是否所有DBMS都支持,但在mySQL中,可以從表上的JOIN中刪除。喜歡的東西:

DELETE Invoice, Ticket, InvoiceTicket 
FROM Invoice, InvoiceTicket, Ticket 
WHERE (condition on Ticket) 
    AND Ticket.Id = InvoiceTicket.TicketId 
    AND InvoiceTicket.InvoiceId = Invoice.Id 
+0

我喜歡這個想法,但我不能讓它在SQL Server中工作 - 它抱怨FROM子句中的多個表源。 – 2009-09-25 15:35:46

+0

我現在無法訪問SQL Server安裝,但從文檔看來,它支持FORM子句中的連接,但不支持多個表作爲目標。 – 2009-09-25 17:35:35

-1

已經有效地指出,刪除發票本身可能會導致問題,如果這些發票被本身未被刪除的invoicetetsets引用。

雖然如此,我想指出的是,無處有我的意思是建議(無處有我居然說),該組的發票將要刪除的應等於設定的發票其ID可以在任何待刪除的invoiceticket中找到。

如果有人將我的信息解釋爲意味着這一點,我想警告那些人不要輕易過於熱切地提出假設。

相關問題