2

次の3つのテーブルがあり、カスケード関係はありません(データベースは主に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
)

私がやろうとしているのは、チケットの基準を指定して、請求書、チケット、および関連するInvoiceTicket行を削除することです。しかし、これはアプリケーションの外部で行う必要があるため、SQLクエリを作成してそれを行うのはなぜですか。

請求書とチケットの両方に対するすべての依存関係をすでに削除しました。問題ありません。InvoiceとTicketはInvoiceTicketによって参照されるため、最初にInvoiceTicketの行を削除する必要があります。ただし、これを行うと、請求書テーブルへのリンクが壊れます(関心のあるチケットは削除できますが、請求書は削除できなくなります)。

SQLを使用してこの操作を実行するために受け入れられている方法は何ですか?

一時テーブルを使用してInvoiceTicketテーブルの対象の行を入力することですでに問題を解決しましたが、このタイプの問題を解決するために他の人は何をしていますか?ストアドプロシージャでもこれを実行できると思いますが、私はそれらを作成することに慣れていません。SQLクエリを介してこの操作を直接行う方法はありますか?

4

5 に答える 5

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

このアプローチ(上記)は、請求書に少なくとも1つの関連するチケットが必要な場合にのみ機能することが有効に指摘されています。これは真実ですが、逆の質問も発生します。一致するチケットに関連付けられているすべての請求書を本当に削除しますか?他の削除されていないチケットにも関連付けられている可能性があるためです。

于 2009-09-25T15:10:16.720 に答える
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
于 2009-09-25T15:12:58.947 に答える
0

InvoiceTicketの行を一時テーブルに配置してから、一時テーブルのIDからInvoiceTicket、Ticket、最後にInvoiceを削除できます。最後に一時的なテーブルを吹き飛ばします。

于 2009-09-25T14:56:20.557 に答える
0

請求書が関連付けられた請求書なしで有効に存在できる場合、RBarryYoungのソリューションはくだらないです。そのような請求書はすべて削除されます。

その場合、削除する請求書のセットを正しく決定するには、最初にそれらを照会して取っておかなければなりません。

于 2009-09-25T16:42:00.517 に答える
-1

請求書自体が削除されていない請求書チケットによって参照されている場合、請求書自体を削除すると問題が発生する可能性があることが正しく指摘されています。

確かに、削除する請求書のセットは、任意の請求書チケットにIDが記載されている請求書のセットと同じである必要があることを示唆するつもりはありませんでした(実際に言ったことはありません)。 -削除されます。

誰かが私のメッセージをそれを意味すると解釈した場合、私はそれらの人々に、あまりにも簡単にそしてあまりにも熱心に仮定をすることの危険性について警告したいと思います。

于 2009-09-25T23:06:37.510 に答える