0

分かりやすいタイトルが思いつかなくてすみません。

複合キー --> ID と属性を持つ 2 列のテーブルがあります。そのため、ID がテーブルに 2 回表示される場合がありますが、各インスタンスには異なる属性があります。

id    attribute
1     1
1     2
2     2
3     1

私の質問は、これを照会する方法です。たとえば、2 つの属性に一致するすべての ID を検索したい

SELECT a.id
FROM   table AS a, table AS b
WHERE  a.attribute = 1
AND    b.attribute = 2
AND    a.id = b.id

したがって、このクエリは id 1 のみを返す必要があります。

SQL を動的に作成することはおそらく可能ですが、事前に検索する属性の数を知る必要があるため、これは非常に厳格です。

このようなテーブルをクエリするより良い方法はありますか? そもそもこのテーブルを構造化するより良い方法はありますか?

助けてくれてありがとう。

4

2 に答える 2

2
SELECT id
FROM   table
WHERE  attribute in (1,2)
group by id
having count(id) = 2

これは、同じ属性を id に 1 回だけ割り当てることができることを前提としています (id/attribute の組み合わせは一意です)。

SQLFiddle の例

于 2012-09-12T16:32:38.037 に答える
0

次のように、テーブルのローテーションを実行して、データのフラット ビューを作成できます。欠点は、結果の列数に一定の制限を課さなければならないことです。次に例を示します。

create view flat_attributes
as
select id ,
       attr_1 = t1.attribute ,
       attr_2 = t2.attribute ,
       attr_3 = t3.attribute ,
       ...
       attr_N = tN.attribute
from ( select distinct
              id
       from attributes
     ) t
left join attributes t1 on t1.id = t.id and t1.attribute = 1
left join attributes t2 on t2.id = t.id and t1.attribute = 2
left join attributes t3 on t3.id = t.id and t1.attribute = 3
...
left join attributes tN on tN.id = t.id and tN.attribute = N

attrnull 以外の列は、問題の にその属性があることを意味しますid。クエリを簡素化する必要があります。

于 2012-09-12T16:42:28.517 に答える