4

次の設定の 2 つのテーブルがあります。

category: (id, name)
item: (id, name, category_id) - category_id is foreign key to category table

現在、使用されているカテゴリのみのカテゴリ テーブルからサブセットを取得するクエリを作成しています。

SELECT c.id, c.name
FROM   category c
WHERE  c.id IN (SELECT DISTINCT category_id FROM item)

上記のクエリは正常に機能します。これがクエリを実行する最も最適な方法なのか、それとも結合などを介して他に何かできることがあるのだろうかと思っています

4

2 に答える 2

5

を に変換するIN (SELECT)EXISTS (SELECT ... WHERE )役立つ場合があります。

SELECT c.id, c.name
FROM   category c
WHERE EXISTS (SELECT 1 FROM item WHERE item.category_id = c.id)

別の可能性(遅くなると思いますが、常にデータベースに依存します):

SELECT c.id, c.name
FROM   category c
INNER JOIN item ON item.category_id = c.id
GROUP BY c.id

DISTINCTまたは、代わりに使用できますGROUP BY

SELECT DISTINCT c.id, c.name
FROM   category c
INNER JOIN item ON item.category_id = c.id

ANALYZE速度がそれほど重要な場合は、時々電話することを忘れないでください。

http://www.sqlite.org/lang_analyze.html

楽しみのための他のいくつかの変種:

SELECT c.id, c.name
FROM   category c
INNER JOIN (SELECT DISTINCT item.category_id ) AS i_c ON i_c.category_id = c.id

別:

SELECT c.id, c.name
FROM   category c

EXCEPT

SELECT c.id, c.name
FROM   category c
LEFT JOIN item ON item.category_id = c.id
WHERE item.category_id IS NULL
于 2012-08-12T22:59:39.547 に答える
0

結合を使用:

SELECT c.id, c.name
FROM   category c
JOIN item i on c.id=i.category_id 
GROUP BY c.id, c.name
于 2012-08-12T22:58:32.480 に答える