주된 문제는 모든 데이터베이스가 공통 테이블 표현식을 지원하지는 않는다는 것입니다.
제 고용주는 DB / 2를 아주 많이 사용합니다. 최신 버전의 CTE를 지원하므로 다음과 같은 작업을 수행 할 수 있습니다.
with custs as (
select acct# as accountNumber, cfname as firstName, clname as lastName,
from wrdCsts
where -- various criteria
)
, accounts as (
select acct# as accountNumber, crBal as currentBalance
from crzyAcctTbl
)
select firstName, lastName, currentBalance
from custs
inner join accounts on custs.accountNumber = accounts.accountNumber
결과적으로 우리는 테이블 / 필드 이름을 크게 축약 할 수 있으며 기본적으로 더 읽기 쉬운 이름으로 임시보기를 작성하여 사용할 수 있습니다. 물론 쿼리가 길어집니다. 그러나 결과는 꽤 명확하게 분리 된 것을 작성하고 (CTE를 사용하여 함수를 사용하여 DRY를 얻는 방법) 매우 읽기 쉬운 코드로 끝날 수 있다는 것입니다. 하위 쿼리를 분리하고 하나의 하위 쿼리가 다른 하위 쿼리를 참조 할 수 있기 때문에 모든 "인라인"이 아닙니다. 때때로, 하나의 CTE를 작성했고, 다른 4 개의 CTE가 모두 그것을 참조한 다음, 주 쿼리에 마지막 4 개의 결과를 통합했습니다.
이것은 다음과 같이 할 수 있습니다 :
- DB / 2
- PostGreSQL
- 신탁
- MS SQL 서버
- MySQL (최신 버전; 여전히 새로운 기능)
- 아마 다른 사람
그러나 코드를 더 깨끗하고 읽기 쉽고 건조하게 만드는 방향으로 길게 나아가고 있습니다.
다양한 쿼리에 플러그인 할 수있는 CTE의 "표준 라이브러리"를 개발하여 새 쿼리에서 빠르게 시작할 수 있습니다. 그들 중 일부는 내 조직의 다른 개발자들도 받아들이 기 시작했습니다.
시간이 지남에 따라 이러한 "표준 라이브러리"를 복사 / 붙여 넣기없이 사용할 수 있도록 이들 중 일부를보기로 전환하는 것이 좋습니다. 그러나 CTE는 여러 가지 요구 사항에 따라 조정되어 결국 CTE를 너무 많이 사용하여 개조없이 사용할 수 없었기 때문에 뷰를 만들 가치가 있습니다.
당신의 고민 중 일부는 "CTE에 대해 왜 잘 모르겠습니까?"인 것 같습니다. 또는 "DB가 CTE를 지원하지 않는 이유는 무엇입니까?"
업데이트에 관해서는 ... 그래, CTE를 사용할 수는 있지만, 내 경험상 set 절과 where 절에서 사용해야합니다. 전체 update 문보다 먼저 하나 이상을 정의한 다음 set / where 절에 "주요 쿼리"부분 만 있으면되지만 그렇게 작동하지 않는 것이 좋습니다. 그리고 업데이트하는 테이블에 모호한 테이블 / 필드 이름을 피할 수 있습니다.
CTE를 사용하여 삭제할 수 있습니다. 해당 테이블에서 삭제하려는 레코드의 PK / FK 값을 결정하려면 여러 CTE가 필요할 수 있습니다. 다시 한 번, 수정중인 테이블에서 테이블 / 필드 이름이 모호해지지 않도록 할 수 없습니다.
삽입물을 선택할 수 있으므로 삽입물에 CTE를 사용할 수 있습니다. 항상 그렇듯이 수정하려는 테이블에서 모호한 테이블 / 필드 이름을 처리 할 수 있습니다.
SQL에서는 getters / setters로 테이블을 줄 바꿈하여 도메인 오브젝트와 동등한 것을 작성할 수 없습니다. 이를 위해서는보다 절차 적 / OO 프로그래밍 언어와 함께 어떤 종류의 ORM을 사용해야합니다. Java / Hibernate에서 이러한 성격의 것을 썼습니다.