이 레거시 SQL 쿼리를보고 있습니다. 얻을 수없는 비트는 동일한 열에서 동일한 테이블을 두 번 내부 결합하는 이유입니다. Table1과 Table1이 별칭 “Table1Alias”와 결합 된 것에 대해 이야기하고 있습니다.
SELECT DISTINCT othercolumns,
Table1Alias.columna
FROM maintable
INNER JOIN secondarytable
ON maintable.id1 = secondarytable.a_id1
INNER JOIN table1
ON secondarytable.id2 = table1.id3
INNER JOIN table1 Table1Alias
ON secondarytable.id2 = Table1Alias.id3
INNER JOIN thirdtable
ON table1.id4 = thirdtable.id5
INNER JOIN fourthtable
ON thirdtable.id6 = fourthtable.id7
INNER JOIN fivetable
ON thirdtable.id8 = fivetable.id9
INNER JOIN sixthtable
ON Table1Alias.columna = sixthtable.id10
LEFT JOIN seventhtable
ON thirdtable.id11 = seventhtable.id12
WHERE LEFT(secondarytable.type123, 2) BETWEEN '01' AND '09'
AND secondarytable.type456 = 'cate'
AND table1.type = '0'
AND Table1Alias.columna = 'conn'
답변
다음과 같이 쿼리를 다시 작성하는 것이 도움이 될 수 있습니다. 따라서 2 개의 조인이 다른 것입니다 .
FROM maintable
INNER JOIN secondarytable
ON maintable.id1 = secondarytable.a_id1
INNER JOIN table1
ON secondarytable.id2 = table1.id3
AND table1.type = '0'
INNER JOIN table1 Table1Alias
ON secondarytable.id2 = Table1Alias.id3
AND Table1Alias.columna = 'conn'
INNER JOIN
...
WHERE LEFT(secondarytable.type123, 2) BETWEEN '01' AND '09'
AND secondarytable.type456 = 'cate'
답변
where
절을 보면 ,가 가리키는 행 table1
은 열 type
이 ‘0’이고,가 가리키는 행 table1alias
은 열 columna
이 ”conn ‘이어야합니다.
아마도 table1
같은 행에 여러 행이 id3
있습니까?
답변
테이블 구조를 보지 않고 접근하는 방법은 더 작은 비 커버링 인덱스를 사용하고 더 큰 커버링 인덱스에서 테이블에 조인하여 ‘키 조회’작업을 피하고 기존 인덱스를 수정하지 않도록 나머지 행을 얻는 것입니다. (또는 색인을 수정할 수없는 경우)
답변
복잡한 조인에서 테이블이 두 번 이상 나타날 때마다 일반적으로 둘 이상의 관계에 참여하는 엔터티가 있기 때문입니다. @Ypercube가 준 대답으로 판단하면 여기에 해당됩니다.
엔티티와 관계는 일반적으로 데이터의 의미와 기본 주제와의 연결을 통해 이해됩니다. 레거시 시스템을 신중하게 구축 한 경우에는 주제를 분석하고 각 데이터 요소를 신중하게 정의하기 위해 약간의주의가 필요했습니다. 그들은 엔티티 관계 모델을 구축했을 수도 있습니다. 신중한 작업이 모두 손실되었을 수 있으며 과거를 파헤쳐 서 재구성해야합니다. 이것은 고고학과 비슷합니다.
Table1과 같은 테이블 이름을 사용하면 주제의 작동 방식에 대한 실마리가 없습니다. 이름이 설명 적이라하더라도 시스템의 주제에 대한 우리의 이해는 귀하의 경우에 필요한 것과 매우 다를 수 있습니다. 그것은 당신에게 달려 있습니다.