2009-07-07 12 views
2

私はデータベース操作にかなり新鮮ですが、今は完全に経験がありません。しかし、私は問題に固執してしまった。 と互換性のあるすべての記事を(任意のサイズの)集合に返すSQLクエリを作成する必要があります。 クエリは、見つかった記事が使用可能(互換性)であるべき記事のリストをユーザが入力できる記事を検索するために、アプリケーション内のスクリプトによって生成されます。SQLデータベース内のArticle compatibilty

だから資料番号をA、B、...、Nのリストについては、疑問がある:
"私に Bと互換性があり、...とNであるすべての記事を与えます"

質問は1つのテーブルにのみ関係します。
互換
artOne
artTwoは

互換の各レコードは、互換性の関係を表すので、他の内の1つの列の資料番号AのレコードとBがあるときに限り物品A及びBは、互換性があること。 NB注文しても、互換性に違いはありません。

今、記事のリストがあると、互換性のあるすべての記事を返すクエリを生成できるようにしたいと考えています。例えば

、私は[1]と互換性のあるすべての記事を望んでいた場合は、クエリは、[2、3]を返します
互換性

 
A B 
---- 
1 2 
3 1 
3 4 

テーブルを検討してください。
リスト[2、3]によって生成されたクエリは[1]を返します。
リスト[1、3]から生成されたクエリは空のリストを生成します。

確かに、これはおそらく問題に取り組むための最良の方法ではありませんので、私はより良い解決策も歓迎します。このタイプの質問には、私がまだ習得していないサブクエリのタイプが必要であると思います。

これは私の質問です。データベースをモデル化する方法はありますか?この特定の問題は簡単な方法で解決されますが、どのような場合でも、誰かが質問を策定するのに役立ち、入力の。被験者の読書の指針も大歓迎です。

感謝

マルコ

+1

テーブル構造を定義し、あなたが詳細 – KuldipMCA

+0

にわかりました、感謝を説明したいものなり。 OPが編集されました。 – Nubsis

答えて

1
SELECT id 
FROM (
     SELECT B AS id 
     FROM compat 
     WHERE A IN (list) 
     UNION 
     SELECT A 
     FROM compat 
     WHERE B IN (list) 
     ) q 
GROUP BY 
     id 
HAVING COUNT(*) = @cnt 
に参加

ここで、@cntはリスト内のアイテムの合計数です。

これを実行するには、互換性ペアにテーブルに2つのエントリがないことを確認する必要があります(つまり、(1, 2)および(2, 1)が同時に悪い場合)。

それは2つの制約を持っているのがベストです:あなたがこれを行う場合は

ALTER TABLE compat ADD CONSTRAINT ux_compat_ab UNIQUE (A, B) 
ALTER TABLE compat ADD CONSTRAINT cc_compat_order CHECK (A < B) 

、あなたがUNIONを置き換えることができます:一つは、他の1は少なくともidとの記事が最初にすることを確認ペアが一意であることを保証しますより効率的なUNION ALLと:

SELECT id 
FROM (
     SELECT B AS id 
     FROM compat 
     WHERE A IN (list) 
     UNION ALL 
     SELECT A 
     FROM compat 
     WHERE B IN (list) 
     ) q 
GROUP BY 
     id 
HAVING COUNT(*) = @cnt 
+0

それはそれを完全に解決しました!ありがとう、トン! ---- Marco – Nubsis

0

選択*記事からインナーはct.ArticleBIDは中(IDのリストは、こちらを参照してください)a.Id = ct.ArticleAID 上compatTblのCT

関連する問題