2017-02-23 2 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`) 
) 

내가 특정 entityrelated 모든 행을 원하지만 내가 가입 할 방법 확실하지 않다, 난 항상 역 참조로 사용하고있는 키 만 관련 얻을.

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; 

나는

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

원하는

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 

을 얻고 나는이

을하지 않으 그래서 경우
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로 엔티티를 제한하므로이 작업을 수행하는 몇 가지 방법이있다,하지만 난 생각 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

제안 해 주셔서 감사합니다. 성능상의 이유로 하위 쿼리를 사용하지 않기 위해 노력하고 있습니다. 대답에 다른 기술 중 하나를 추가 할 수 있습니까? – shane

+0

제대로 인덱싱되면이 쿼리에 성능 저하가 없습니다. Explain 확장 형식 = json을 사용하여 데이터베이스가 수행 할 작업과 수행 할 작업의 성향을 이해한다고 가정하는 대신 이러한 유형의 작업과 타이밍을 결정해야합니다. 열쇠에 대한 가정 된 인덱스뿐만 아니라 물론 외래 키. – gview

0

모두 key 값을 원하면 key으로 필터링하는 이유는 무엇입니까? 그런 다음 말에서, 당신이 원하는 것 JOIN 간단한 :

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

모든 키가 필터링되기 때문에 다른 모든'엔터티'행과 함께 키가 속한 엔터티 행만 원할 것입니다. 관련 '행에 적용 – shane