2014-11-07 1 views
1

Android 앱용 SQLite 데이터베이스에 3 개의 테이블이 있습니다. 아래 그림은 내가 작업하고있는 관련 테이블을 보여줍니다.왼쪽 외부 조인과 3 개의 테이블 연결

Tables

나는 측정의 특정 person_id로 묶여 각각 measurement_lines 및 역량에서, 두 개의 필드, 값과 이름을 얻기 위해 노력하고있어. 이 필드를 반환하는 쿼리를 만들려고하지만 약간의 운이 있습니다. 지금까지 얻은 것 중 가장 좋은 점은 다음과 같습니다.

SELECT name, value 
FROM measurements, measurement_lines, competences 
WHERE measurements.id = measurement_lines.measurements_id 
AND measurement_lines.competences_id = competences.id 
AND measurements.persons_id = 1 

이 문제는 하나의 문제입니다. 이 쿼리는 사람이 측정 항목에 항목이 없을 때 (그리고 이후 measurement_lines에 아무 것도없는) 레코드를 반환하지 않습니다. 가치 칼럼이 비어 있더라도 항상 능력 이름 목록을 얻고 싶습니다. 나는 이것을 위해 Left Outer Join이 필요하다고 생각하지만, 제대로 작동하지 않는 것처럼 보입니다. 내부 조인에 대한

SELECT name, value 
FROM measurements AS m, competences AS c 
LEFT OUTER JOIN measurement_lines AS ml ON c._id = ml.competence_id 
WHERE ml.measurement_id = m._id AND m.persons_id = 1 

답변

2

, 당신은 조건 선택 Join 술어의 차이로 실수 할 수 있지만, 외부 참여 조인 할 때 차이가 그 다음 쿼리는 레코드를 반환하지 않습니다. WHERE 절에 나타나는 모든 기준은 이후에 결과 행 을 필터링하여 모든 조인이 수행되며 (논리적으로는 최소한) 외부 테이블과 연관된 결과 행을 제거 할 수 있습니다.

조인 순서에 대해 확실하지 않은 경우 괄호를 사용하여 의도를 분명히 할 수 있습니다. 적어도 많은 DBMS에서. 그것은 SQLite 같은 lokos 그들을 지원하지 않습니다.

그것은 당신이 할 수처럼 보이는 : 나는 ml.competences_id에 "그런 열"을 받고 없습니다 계속

SELECT c.name, pm.value 
FROM competences c 
    LEFT OUTER JOIN (
     SELECT ml.competences_id AS cid, 
     ml.value AS value 
     FROM measurement_lines ml 
     INNER JOIN measurements m 
     ON m.id = ml.measurements_id 
     WHERE m.person_id = 1 
) pm 
    ON pm.cid = c.id 
+0

(괄호의 사용을 방지하기 위해 편집). 나는 그것이 괄호로 인해 발생한다고 믿는다. ml.measurements_id – Anubis

+0

괄호를 사용하지 않는 버전으로 업데이트했는데, 이는 약간 까다 롭다. 나는 그것이 있다고 생각한다. 'WHERE' 절은 지정된 사람과 일치하는 결과 행과 competence와 일치하는 measurement_line이없는 결과 행을 선택합니다. –

+0

다시 업데이트했습니다. 새 버전에서는 하위 쿼리 (비 상관)를 사용합니다. 조인을 직접 그룹화하지 않고이 권한을 얻는 것이 필요하다고 생각합니다. –