2011-08-30 14 views
4

大きなクエリがありますが、私の大きな問題はこの小さな部分にあります。SQLグループ化されたレコードに一致する複数の文字列がある場合に選択

ItemIDは、マスターアイテムテーブルに外部キーが割り当てられています。これは一意ではありません。このクエリは私が望む(行は4つの名前すべてを持つことはできません)行いませんが、私が探しているものを示しています。

Select masteritemid from itemsgrouptable 
where itemname like 'Item 1' 
And itemname like 'Item 2' 
And itemname like 'Item 3' 
And itemname like 'Item 4' 

4つのリストされたレコードがそのIDで存在する場合のみ、itemidをプルします。私の現在のメソッドはIDに基づいて同じテーブルを4回一緒に結合し、各セクションは1つの文字列を見ています...それは非常に非効率的です。

+1

あなたは 'AND'を意味しますか?あなたのクエリからは、すべてのアイテムをAND'ingしているので、すべてのアイテムが必要なように見えるからです。 – NullUserException

+1

「LIKE」による文字列比較に依存するものは、「非常に効率的」ではないと主張します。 – NullUserException

答えて

3

正規表現一致を使用する:

select masteritemid from itemsgrouptable 
where itemname regexp 'Item [1234].*' 

これは

1

これはしばらくの間毎回発生します。私が期待するほど簡単ではありません。

まず、完全一致の場合は「LIKE」ステートメントを実行しないでください。 like文は、直接比較よりも効率が悪いです。

第二に、あなたはHAVING句/ GROUP BYに求めているものを達成することができます:

SELECT masteritemid FROM itemsgrouptable 
GROUP BY masteritemid 
HAVING COUNT(itemname) = 4 
WHERE itemname IN ('Item 1','Item 2','Item 3','Item 4') 

を基本的にあなたがmasteritemidであなたのすべての項目をグループ化し、すべての4(または設定グループ化、規制されています任意の数の "項目#"一致)が指定された "IN"節内にあります。一種の素敵なトリック。

+0

彼らは正確ではない? 'Item 1'にはワイルドカードを使用するオプションがあるので、Floor Shine Spray、Floor Shine Waxなどが必要な場合は 'Floor Shine%'になります。 –

+0

完全に一致していない場合は、どのような条件が当てはまることをどのように知っていますか? – feathj

0

TRY

"アイテム1" 又は "アイテム2" 又は "アイテム3" または "項目4" のいずれかで始まるitemNameに一致します
SELECT masteritemid FROM itemsgrouptable 
WHERE itemname REGEXP '^Item[:digit]?+' 

Reference

関連する問題