次のようなデータベーステーブルがあります。
ForeignId: int
Key: varchar
Value: varchar
ForeignId と Key が一意の主キーを構成する場所
特定のドキュメント セットに対して定義されたキーの合計セットを簡単に判断できます。
SELECT DISTINCT [Key] FROM [Table] WHERE [ForeignId] IN (...)
しかし、私がやりたいことは、すべての ForeignId で同じである場合に、各プロパティの各値の値をさらに区別することです (値が異なる場合は NULL またはその他のセンティナル値)。
私が次のようなことをした場合:
ForeignId キー値 1 1 あ 1 2 ビ 1 3 C 2 1 あ 2 2 Z 3 1 あ 3 2 Z
次のような出力が必要です。
キー値 1 A -- 3 つすべて同じ 2 NULL -- 複数の異なる値 (B および Z) 3 NULL -- 1 つの ForeignId に対してのみ定義
私が思いついた最高のものは
SELECT [Key], MAX([Value]), MIN([Value]) FROM [Table]
WHERE [ForeignId] IN (...)
GROUP BY [Key]
返された最大値と最小値が異なるインスタンスを探します。それらが同じであれば、すべての値が一致すると仮定します。それらが異なる場合、複数の異なる値があることがわかります。
ここに欠けているのは、個々の項目のいずれかにまったく定義がない場合、値を異なるものとしてマークする必要がある 3 番目の部分です。上記の例では、一部の ForeignIds に対して定義されていない場合でも、現在のコードはキー 3 に対して値 C を返します。