項目/属性リストにいくつかの属性を持つアイテムを選択するためのSQL文は何ですか?

StackOverflow https://stackoverflow.com/questions/927724

質問

タグ、私は次のように記載されている項目と属性を持つテーブルを持っていると言います
frog    green
cat     furry
frog    nice
cat     4 legs
frog    4 legs

の項目欄から私は緑と4脚の属性の両方を持っているユニークなオブジェクトを選択します。私は、この場合には、単にカエルオブジェクトを取り戻すことを期待します。これを行うための最も効率的なクエリとは何ですか?

役に立ちましたか?

解決

select  item.name 
from    item 
where   item.attribute in ('4 legs', 'green') 
group by item.name 
having  count(distinct item.attribute) = 2

他のヒント

これを行うための最も効率的な方法は、自己結合であります

SELECT * FROM attributes a1 
JOIN attributes a2 USING (item_name) -- e.g. frog
WHERE a1.value = 'green' AND a2.value = '4 legs';

一部の人が使う別の解決策は、GROUP BYとトリックです

SELECT item_name FROM attributes
WHERE value IN ('4 legs', 'green')
GROUP BY item_name
HAVING COUNT(*) = 2;

しかし、解決策BY GROUPは、使用するRDBMSのどのブランドに応じて、登録しようとして効率的ではないかもしれません。あなたのテーブル内のボリュームの成長に合わせてもひとつの方法は、より良いスケーリングすることができる。

SELECT * FROMテーブルからどこの事= 'カエル'

何がしたいかを正確に知ることに勝るものはありません。

select
    item, count(*)
from
    @temp
where
    attribute in ('4 legs','green')
group by
    item
having
    count(*) = 2 -- this "2" needs to be replaced with however many attributes you have

また、個別に各属性を照会し、それらを交差することができ...

/*
-- create sample table...
create table #temp1
    (item varchar(max),
    attrib varchar(max))

-- populate sample table (SQL 08)...
insert #temp1
values ('frog', 'green'), ('cat', 'furry'), ('frog', 'nice'), ('cat', '4 legs'), ('frog', '4 legs')
*/


SELECT  item
FROM    #temp1
WHERE   attrib = 'green'
INTERSECT
SELECT  item
FROM    #temp1
WHERE   attrib = '4 legs'

2つの表のいずれかの項目と属性のいずれかを作成します。
アイテムはintAttributeIDは、属性テーブルを参照する外部キーである名前、intAttributeID、可能性があります。あなたが気にどんなオフに基づいてselect文を実行できます。

その方法

しかし、多分、これはあなたを助けることができます:

SELECT * 
FROM tbl t1
INNER JOIN tbl t2 ON t1.Name = t2.Name
WHERE t1.Attribute = 'green' AND t2.Attribute = '4 legs'

<ストライキ>ハードそれが正規化されたモデルではないので。それは週末です。

あなたは、複数の、未接続の行全体でフィルタリングされているので、あなたは順番に各属性を抽出して、アイテムを一致させる必要があると思います。

SELECT
   item
FROM
    (SELECT
        item
    FROM
        Mytable
    WHERE
        attribute = '4 legs') k1
    JOIN
    (SELECT
        item
    FROM
        Mytable
    WHERE
        attribute = 'green') k2 ON k1.item = k2.item

可能であれば、私は再設計です。これはあなたが効果的に

(それは12加入が必要になります)に同時にオンに12個の値を照会することができるようになりますものではありません

このWikipediaの記事をお読みください http://en.wikipedia.org/wiki/Entity-Attribute-Value_model#欠点

最終的に深刻なパフォーマンスの問題に実行されなかったこのモデルを使用し、まだデータベースを見たことがありません。この設計は、データベース以外の人々にエレガントに見えますが、通常は、実際にひどく設計されたデータベースのサインです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top