2017-02-23 6 views
0

関連する行のいずれかを使用してエンティティを指定することによって、関連するすべての行を単一のエンティティに取得しようとしています。SQLはすべての結合要素を取得し、結合テーブルを介して結合エンティティを指定します。

CREATE TABLE entity (
    id INTEGER PRIMARY KEY 
) 

CREATE TABLE related (
    id INTEGER PRIMARY KEY 
    key VARCHAR(32) UNIQUE NOT NULL 
    entity_id INTEGER FOREIGN KEY (`entity.id`) 
) 

私は、特定のentityためrelatedすべての行をしたいが、私は参加を行う方法がわからないです、私はいつも私が間接参照に使用していたキーを持つ唯一の関連を取得します。

SELECT 
    * 
FROM 
    entity e, 
    related r 
     JOIN 
    related r1 
WHERE 
    e.id = r.entity_id 
     AND r.key= 'lookup key' 
     AND r1.entity_id = e.id; 

私は

INSERT INTO entity VALUES (1, 2); 
INSERT INTO related VALUES (1, 'lookup key' 1), 
    (2, 'other key' 1), 
    (3, 'another key' 1), 
    (4, 'this key' 2), 
    (5, 'that key' 2), 
    (6, 'their key' 2); 

を実行するのであれば、私は

entity.id related.id related.key related.entity_id 
1   1    lookup key  1 
1   2    other key  1 
1   3    another key 1 

をしたいしかし、私はいつも

entity.id related.id related.key related.entity_id 
1   1    lookup key  1 

を取得し、私はこの

を望んでいません
entity.id related.id related.key related.entity_id 
1   1    lookup key  1 
1   2    other key  1 
1   3    another key 1 
2   4    this key  2 
2   5    that key  2 
2   6    their key  2 

私はSQLが100%正しくないことを知っています。

+0

あなたの質問を編集し、サンプルデータと希望する結果を提供してください。 –

+0

@GordonLinoff質問をより完全にするために変更を加えました – shane

答えて

1

は、論理的には、あなたが本当に何をしたいのかidでエンティティを拘束しているので、これを行うには、いくつかの異なる方法がありますが、私は思う:次に、あなたが言うことから、簡単なJOINをしたいように見えますcorrelated subqueryの背後にある構文とアイデアは最も明白です。

SELECT 
    * 
FROM 
    entity e, 
    JOIN 
    related r 
WHERE 
    r.entity_id = e.entity_id 
    AND e.entity_id IN (SELECT entity_id FROM related WHERE key = 'lookup key') 
+0

提案していただきありがとうございます。パフォーマンス上の理由からサブクエリを使用しないようにしようとしています。答えに他のテクニックの1つを追加できますか? – shane

+0

適切に索引付けされると、この問合せにはパフォーマンス上のペナルティはありません。あなたは、データベースが何をしようとしているのか、どのようにパフォーマンスが上がっているのかを理解することを前提とするのではなく、この拡張タイプ= jsonを使用してタイミングと同様にこのタイプのものを判断する必要があります。想定されているキーのインデックス、もちろん外部キー。 – gview

0

keyの値をすべて入力したい場合は、keyでフィルタリングする理由は何ですか?

SELECT e.*, r.* 
FROM entity e JOIN 
    related r 
    ON e.id = r.entity_id; 
+0

私はすべての 'entity'行を望んでいないので、私はキーをフィルタリングしています。私は、' key'が属するエンティティ行だけを他の 'そのエンティティに属する関連する行 – shane

関連する問題