ユニークなコラムがあります。また、列の可能な値である要素の既知のセットもあります。可能な値のうち、まだテーブルにないもの、つまり挿入に適しているものを知る必要があります。
これは SQL で可能ですか、それとも後処理が必要ですか?
現在、「in」演算子を使用して、列の値がセット内の要素と等しいすべての行を選択しています。次に、後処理によって、一致したすべての要素をセットから削除します。
ユニークなコラムがあります。また、列の可能な値である要素の既知のセットもあります。可能な値のうち、まだテーブルにないもの、つまり挿入に適しているものを知る必要があります。
これは SQL で可能ですか、それとも後処理が必要ですか?
現在、「in」演算子を使用して、列の値がセット内の要素と等しいすべての行を選択しています。次に、後処理によって、一致したすべての要素をセットから削除します。
これを完全にSQLで行うには、1つの列を持つ別のテーブルを作成する必要があります。各行は、既知の要素のセットから1つの値を保持します。テーブルがElementListと呼ばれ、他のテーブルがExistingと呼ばれると仮定します。
SELECT * FROM ElementList WHERE Element NOT IN
(SELECT DISTINCT Element FROM Existing)
使用しているデータベースエンジンによっては、一時テーブルを使用して、データベースに永続的に保存せずにリストを作成して保持できる場合があります。ただし、許可された要素のリストを保存することは、既存のテーブルの要素列を制約する場合(および、ユーザーインターフェイスで許可された要素をユーザーに提示する場合)に役立ちます。
許可された値を一時テーブルallowed
に貼り付けてから、次を使用してサブクエリを使用しNOT IN
ます。
SELECT *
FROM allowed
WHERE allowed.val NOT IN (
SELECT maintable.val
)
一部の DB では、別のテーブルを作成する代わりに、「その場で」テーブルを作成できます。例: PostgreSQL (任意のバージョン):
SELECT *
FROM (
SELECT 'foo'
UNION ALL SELECT 'bar'
UNION ALL SELECT 'baz' -- etc.
) inplace_allowed
WHERE inplace_allowed.val NOT IN (
SELECT maintable.val
)
より新しいバージョンの PostgreSQL (およびおそらく他の DB) では、少し優れたVALUES構文を使用して同じことを行うことができます。