0

たとえば、4 つのテーブルがあり、すべて userID を持っています (これは複数回参照できます。たとえば、次のようにすることができます。

Cars
id, ..., userID  // userID = owner of the car

Garages
id, ..., userID // userID = owner of the garage

Tools
id, ..., userID // userID = owner of the tool

ユーザーを削除するクエリを実行したいのですが、関連するデータがすべてなくなった場合にのみユーザーを削除したいと考えています。つまり、参照されているデータがないことを確認したい (たとえば、userID = -1 または null を持つことは許可されていないとします。ユーザーに割り当てる必要があります)。

チェックを行う唯一の方法は次のとおりです。

SELECT count(*) FROM Cars WHERE USERID = userID
SELECT count(*) FROM Garages WHERE USERID = userID
SELECT count(*) FROM Tools WHERE USERID = userID

結果のいずれかが 0 より大きいかどうかを確認する必要がある場所.1 つの SQL SELECT クエリで N テーブルにわたってこのチェックを行う方法はありますか?

4

4 に答える 4

2

次のように、カウントを合計できます。

SELECT (SELECT count(*) FROM Cars WHERE USERID = userID)
     + (SELECT count(*) FROM Garages WHERE USERID = userID)
     + (SELECT count(*) FROM Tools WHERE USERID = userID)
FROM ...

結果が 0 以外の場合は、参照されたユーザーがいます。

于 2013-01-21T08:48:25.540 に答える
2

車、ガレージ、またはツールをまだ持っているユーザーを削除したくない場合は、それらのテーブルからユーザー テーブルに外部キーを追加する必要があります。

その後、まだ参照されているユーザーを削除しようとすると、適切なエラー メッセージをユーザーに表示するなどして、キャッチして対処できるエラーが発生します。

これには、誰かがユーザーを削除しようとする方法に関係なく、削除が常に防止されるという追加の利点があります (SQL コマンドライン、アプリケーション内のバグのあるコードなど)。

于 2013-01-21T08:59:36.097 に答える
1
SELECT  (SELECT count(*) FROM Cars WHERE USERID = userID) as CarCount
,       (SELECT count(*) FROM Garages WHERE USERID = userID) as GarageCount
,       (SELECT count(*) FROM Tools WHERE USERID = userID) as ToolCount
于 2013-01-21T08:47:49.073 に答える
0

車が変更したいメインテーブルである場合は、これを試すこともできます。

SELECT count(*)
FROM   Cars 
       INNER JOIN
       Garages 
       ON Cars.USERID = Garages.USERID, 
       INNER JOIN
       Tools
       ON Cars.USERID= Tools.USERID
WHERE  Cars.USERID = SOME_USER_ID;

USERID の外部キーを作成することを提案します。

于 2013-01-21T09:33:32.007 に答える