2013-05-11 2 views
1
|----------------------------| 
| Tbl_1      | 
|--------------|-------------| 
| id   | name_1  | 
|--------------|-------------| 
| 1   | t_1_rec_1 | 
|--------------|-------------| 

|------------------------------------------------------------| 
| Tbl_2              | 
|-------|--------------|-----------|------------|------------| 
| id | name_2  | tbl_1_id | tbl_3_id | tbl_4_id | 
|-------|--------------|-----------|------------|------------| 
| 1 | t_2_rec_1 | 1   | 1   | 2   | 
| 2 | t_2_rec_2 | 1   | 2   | 1   | 
|-------|--------------|-----------|------------|------------| 

|------------------------| 
| Tbl_3     | 
|----------|-------------| 
| id  | name_3  | 
|----------|-------------| 
| 1  | t_3_rec_1 | 
| 2  | t_3_rec_2 | 
|----------|-------------| 

|----------------------| 
| Tbl_4    | 
|--------|-------------| 
| id | name_4  | 
|--------|-------------| 
| 1  | t_4_rec_1 | 
| 2  | t_4_rec_2 | 
|--------|-------------| 


|--------------------------------------------| 
| Tbl_5          | 
|------|------------|------------|-----------| 
| id | name_5 | tbl_2_id | tbl_6_id | 
|------|------------|------------|-----------| 
| 1 | t_5_rec_1 | 1   | 1   | 
| 2 | t_5_rec_2 | 1   | 2   | 
|------|------------|------------|-----------| 

|----------------------------------| 
| Tbl_6       | 
|-------|------------| 
| id | name_6  | 
|-------|------------| 
| 1 | t_6_rec_1 | 
| 2 | t_6_rec_2 | 
|-------|------------| 

나는이 결과를 기대하고 존재하지 않을 때 기록을 반환하지 조인 왼쪽에 조인내부는 왼쪽에 합류 기록

t1.name_1 t2.name_2 t3.name_3 t4.name_4 t5.name_5 t6.name_6 

t_1_rec_1 t_2_rec_1 t_3_rec_1 t_4_rec_2 t_5_rec_1 t_6_rec_1 
t_1_rec_1 t_2_rec_1 t_3_rec_1 t_4_rec_2 t_5_rec_2 t_6_rec_2 
t_1_rec_1 t_2_rec_2 t_3_rec_2 t_4_rec_1 

select t1.name_1, t2.name_2, t3.name_3, t4.name_4, t5.name_5, t6.name_6 
from Tbl_1 as t1 
left join Tbl_2 as t2 on t2.id = t1.id 
inner join Tbl_3 as t3 on t2.tbl_3_id = t3.id 
inner join Tbl_4 as t4 on t2.tbl_4_id = t4.id 
left join Tbl_5 as t5 on t5.id = t2.id 
inner join Tbl_6 as t6 on t2.tbl_6_id = t6.id 

그러나이 작동하지 않습니다 !!!!! 세 번째 행은 반환되지 않습니다. 마지막 내부 조인 (Tbl_6)을 왼쪽 조인으로 변경하면 세 번째 행이 생성됩니다.

Tbl_5와 Tbl_6 사이의 내부 조인은 Tbl_5 레코드가 발생하지 않지만 Tbl_2와 Tbl_5 사이의 왼쪽 조인은 Tbl_2가되고 내부 조인 된 Tbl_3 및 Tbl_4 레코드는 거기에 있고 Tbl_1의 결과가 Tbl_2에 남았습니다. 그러면 세 번째 행을 얻을 수 있습니다.

무엇이 누락 되었습니까? (차라리 Tbl_5 레코드에 후자가없는 Tbl_5 레코드를 원하지 않기 때문에 내부 조인을 변경하지 않아도됩니다.) 또한이 쿼리는 Zend Db 클래스에서 생성 된 것이므로 필요할 수 있습니다. 그것에 대한 답변을 포함 시키십시오. 제대로 작동하는 쿼리가 있거나 예상대로 Zend를 생성하는 방법을 알아낼 것입니다.

+0

FROM 절에서 1,2,5,3,4,6 순서로 테이블을 처리하십시오. –

답변

0

SQL (및 MySQL)에서 inner join, left outer join, right outer joincross join 작업은 모두 동일한 우선 순위를 갖습니다. 따라서 a left join b inner join c(a left join b) inner join c입니다. 마찬가지로, 연산 식 1 - 2 + 3(1 - 2) + 3이 아니고 1 - (2 + 3)이 아닙니다. 이와

염두에두고,의 당신의 from 절을 살펴 보자 :

from Tbl_1 as t1 
left join Tbl_2 as t2 on t2.id = t1.id 
inner join Tbl_3 as t3 on t2.tbl_3_id = t3.id 
inner join Tbl_4 as t4 on t2.tbl_4_id = t4.id 
left join Tbl_5 as t5 on t5.id = t2.id 
inner join Tbl_6 as t6 on t2.tbl_6_id = t6.id 

첫 번째 내부 조인은 t2.tbl_3_id = t3.id입니다. t2 테이블에 t1의 일치 항목이 없으면 열 t2.tbl_3_id이 NULL입니다. NULL 값이 일치하지 않으므로 첫 번째 조인을 내부 조인으로 바꾸는 것이 효과적입니다.

당신과 함께이 문제를 해결할 수있는 구문과 같은 :

inner join Tbl_3 as t3 on t2.tbl_3_id = t3.id or t2.id is null 

합니다 (NULL 비교는 ID가 유효한 경기에서 NULL이 될 수 있다고 경우 t2.id보다는 t2.tbl_3_id이다.)

당신이 할 수있는 후속 조인에 대해이 논리를 계속하십시오.

외부 조인과 내부 조인을 혼합하면 이 아닌이 자동으로 외부 조인을 내부 조인으로 변환합니다. 이는 on 절의 조건에 따라 다릅니다.

개인적으로, 나는 조인의 의미를 따르는 것이 다소 번거롭다는 것을 알게되었습니다. 내부 조인 만 사용하거나 거의 외부 조인을 사용하여 거의 모든 쿼리를 작성합니다. 즉, 모든 것이 일치하는 행을 유지하거나 첫 번째 테이블의 모든 행을 유지합니다.

조인 유형을 혼합하려면 두 가지 옵션이 있습니다. 첫 번째는 MySQL에서 성능 문제를 일으킬 수있는 하위 쿼리를 사용하는 것입니다. 또는 left outer join을 사용하고 where 절에 조건을 추가하여 원하는 논리를 적용하십시오.

+0

안녕하세요 고든. 첫 번째 라인 ('SQL (및 MySQL) ...)'), 지금 당장 시도 할 자료가 없지만 오라클이 다르게 행동한다고 ​​생각합니다. – Sebas

+0

나는이 "또는 t2.id null입니다"시도하고 그 Tbl_3 (실제로 Tbl_6 mycase있는 모든 레코드에 대한 반환 된 레코드가 발생하지만 내부 조인에 대한 null에 대한 부모 ID를 확인하는 것이 포인트는 치료 만 아이를위한 모든 가능성은 사실로 일치합니다. 나는 이것에 대한 더 깊은 생각이 아이가없는 곳을보고 싶다는 결심을하게 만들었 기 때문에 모든 왼쪽 조인을해야 할 것 같습니다. 아동 기록이 반환되면 다른 사람이 생각할 수있는 일을하게됩니다. 나는 그것에 대해 듣고 감사하게 생각합니다. – StevenHill