質問

SQL Server 2005。

外部キー制約を必要としなかったとされるアプリケーションのデータベースに外部キー制約を追加しています。当然、データは信頼できなくなり、外部キーフィールドに孤立したエントリがあります。

セットアップ:
TableUserとTableOrderの2つのテーブル。 TableUserには主キー「UserID」があり、TableOrderには外部キー「UserID」があります。

TableOrder.UserIDに一致するエントリがTableUser.UserIDにない行を見つけるにはどうすればよいですか

たとえば、TableOrder.UserIDの値は250ですが、250に一致するTableUser.UserIDキーはありません。

役に立ちましたか?

解決

1つの方法を次に示します。

select * from TableOrder where UserID not in (select UserID from TableUser);

この種のクエリを作成するには、さまざまな方法があります。

他のヒント

他の一般的なアプローチは、左外部結合です:

SELECT * FROM TableOrder o
LEFT OUTER JOIN TableUser u ON o.UserID = u.UserID
WHERE u.UserID is NULL

このクエリは、where句なしで、対応する値(存在する場合)を参照して確認し、一致しない値を確認するのにも役立ちます。

最初にテーブルにFK制約はありませんでした。 FKやPKのように使用されていましたが、コード化されていませんでした。これらは不要なオーバーヘッドであるという信念でした。したがって、すべての列がありますが、コード化された制約はありません。それらを強制するためにそれらを入れに行ったとき、私は多くの違反があることを発見しました。

質問は問題を浮き彫りにします。これらは不必要なオーバーヘッドではなく、人々が一般的なデータベースの攻撃を防止します。

グレッグとブラッドの両方の答えが私を助けてくれました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top