0

次のようなデータベーステーブルがあります。


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 を返します。

4

3 に答える 3

1

わかりました。あなたの質問が理解できたら、キーと値の 2 つの列を含むリストを生成する必要があります。

リストには各キーごとに 1 つの行があり、値の列は次のように定義できます。

すべてのキーに定義されているが、複数の値が含まれている場合は NULL ForeignID' すべてのキーに定義されている場合は NULL すべてのキーに定義されていて、その値が一貫して同じである場合の値

だから、私たちは次のようなことをしたいと思います:

選択する
    TABLE.KEY、
    データ.VAL
から
    テーブル
左結合
(
   SELECT KEY, VALUE FROM TABLE GROUP BY KEY, VALUE HAVING COUNT(*) = x
) データ


ここで、x は個別のキーの数です (サブクエリにスローしたい場合があります)。

左結合により、すべてのキーが確実に一覧表示されます。サブクエリは、グループ化の数がキーの数と等しい場合にのみ値を返します。

私は自分の構文をテストするための sql (家にいて、新しい PC) にアクセスすることはできませんが、このアイデアはあなたを正しい道に導くはずだと思います。

あなたの質問を誤解している場合は、お知らせください

于 2009-02-12T22:54:39.017 に答える
0

クリスはほとんどそれを持っていました。別のグループを追加すると、あなたはゴールデンです.

SELECT
    TABLE.KEY,
    data.VAL
FROM
    TABLE
LEFT JOIN
(
   SELECT KEY, VALUE FROM TABLE GROUP BY KEY, VALUE HAVING COUNT(*) = x
) data on Table.Key = data.Key
group by Table.Key, data.VAL
于 2009-02-12T23:07:14.573 に答える