3

非常に大きなベースの小さなバックアップを作成したい (開発者が 15 GB ではなく ~1 ~ 2 GB をダウンロードできるようにするため)。

そのために、ベースをコピーし、いくつかのテーブル (ログなど) を切り捨てるいくつかのスクリプトを実行し、一部のユーザー (常に同じユーザー) を除いてデータを削除したいと考えています。

今私はこれを持っています:

-- delete order details not in test accounts
DELETE FROM order_details WHERE Album_ID NOT IN (
    SELECT Album_ID FROM albums WHERE User_ID IN (
        SELECT User_ID FROM users
            WHERE Email_ID LIKE '%@xxx.com'
            OR Email_ID LIKE '%@yyy.com'
            OR Email_ID LIKE '%@zzz.com'
    )
)
DELETE FROM orders WHERE User_ID NOT IN (
    SELECT User_ID FROM users
        WHERE Email_ID LIKE '%@xxx.com'
        OR Email_ID LIKE '%@yyy.com'
        OR Email_ID LIKE '%@zzz.com'
)

-- delete albums not in test accounts
DELETE FROM albums WHERE User_ID NOT IN (
    SELECT User_ID FROM users
        WHERE Email_ID LIKE '%@xxx.com'
        OR Email_ID LIKE '%@yyy.com'
        OR Email_ID LIKE '%@zzz.com'
)
-- snip a few more of the same

ご覧のとおりSELECT User_ID FROM users WHERE Email_ID LIKE '%@xxx.com' OR Email_ID LIKE '%@yyy.com' OR...、かなりの数の場所で常に同じサブクエリを使用しています。

繰り返す必要がないようにするにはどうすればよいでしょうか。

ありがとうございました !

4

6 に答える 6

0

テーブルに外部キーが設定されている場合は、それらをカスケード削除用に設定できます。適切に行われた場合、users テーブルから削除するだけで済み、他のすべてのテーブルにカスケードされます。

カスケード削除に関するドキュメントは山ほどあるので、ここでは繰り返しませんが、調べる価値は確かにあります。

于 2013-04-02T12:41:47.980 に答える
0

結果を一時テーブルに格納する

   -- create temporary table to keep track of users
   CREATE TABLE #users
   (
      user_id BIGINT
   )

一時テーブルをロードする

INSERT INTO #users (user_id)
SELECT User_ID FROM users
        WHERE Email_ID LIKE '%@xxx.com'
        OR Email_ID LIKE '%@yyy.com'
        OR Email_ID LIKE '%@zzz.com'

その後、他のクエリで一時テーブルを使用できます。

-- delete order details not in test accounts
DELETE FROM order_details WHERE Album_ID NOT IN (
    SELECT Album_ID FROM albums WHERE User_ID IN (
        SELECT User_ID FROM #users
    )
)
DELETE FROM orders WHERE User_ID NOT IN (
    SELECT User_ID FROM #users
)

-- delete albums not in test accounts
DELETE FROM albums WHERE User_ID NOT IN (
    SELECT User_ID FROM #users
)

この手法では、クエリを 1 か所で定義するだけなので、 DRY の原則に従うことができます。ビジネス ロジックを変更する必要がある場合、元のコードのように 3 つのクエリではなく、その 1 つのクエリを変更するだけで済みます。

于 2013-04-02T12:31:12.250 に答える
0

これはとても良い質問です。残念なことに、SQL は SQL クエリを構成する優れた機能を提供しません。

私が考えることができる最高のものは、ビューまたはテーブル値関数です。スクリプトの最初に作成し、最後に削除できます。

この場合、SQL 文字列を動的に構築するよりも優れているように見えます。

于 2013-04-02T12:31:13.643 に答える