2017-01-02 5 views
1
with 
printercheck as (SELECT EXISTS (SELECT 1 FROM available_material_printmode_config 
WHERE printer_name ='123' LIMIT 1) as p), 
materialcheck as (SELECT case when material_name is null then 0 else 1 end as m 
FROM available_material_printmode_config WHERE printer_name ='123' 
and printmode_name = '2' LIMIT 1) 

select m.name from material m 

left join available_material_printmode_config ac on ac.material_name = m.name 
and (select p from printercheck limit 1) 
and (select m from materialcheck limit 1) 

left join available_materials am1 on am1.material_name = m.name 
and ((select p from printercheck limit 1) != 1 
or ((select p from printercheck limit 1) 
and (select m from materialcheck limit 1) !=1)) 

where 
case 
when (select p from printercheck limit 1) and (select m from materialcheck limit 1) 
then 
ac.printer_name = '123' and ac.printmode_name = '2' 
else 
am1.printer_name = '123' 
end 

나는 이런 식으로 보이는 sqlite3 쿼리를 가지고 있는데, printercheck와 materialcheck가 메인 쿼리의 각 행에 대해 실행되거나 페치 될 것인지 아니면 한번 실행되고 결과가 저장되고 재사용되는지를 알고 싶다.sqlite3에서 With 절 사용; with 절의 결과가 저장되고 재사용됩니까?

메인 쿼리의 각 행에 대해 printercheck 및 materialcheck가 실행되면이를 피하고 printercheck 및 materialcheck 결과를 한 번 실행하여 다시 사용하는 방법.

답변

2

다른 데이터베이스가 CTE를 다르게 처리하므로 좋은 질문입니다. 예를 들어, SQL Server는 CTE를 구체화하지 않습니다. 오라클은 종종 그렇습니다. SQLite는 documentation에 따르면

: 그것은 은 하나의 문이 지속되는 동안 존재 함을 볼 수있는 것처럼

평범한 공통 테이블 표현식이 작동합니다. 일반 공통 테이블 식은 하위 쿼리를 팩터링하고 전체적인 SQL 문을 읽기 쉽고 이해하기 쉽게 만드는 데 유용합니다.

이 문서를 바탕으로 SQLite는 일반 CTE (재귀 CTE는 다른 짐승)를 구현하지 않는다고 말합니다. 임시 테이블이 필요하면 명시 적으로 사용하십시오.

+0

임시 테이블에 대해 언급 한 시점의 조회수는 무엇입니까? 보기의 결과가 저장되고 재사용됩니까? SQlite3 –

+0

"SQL Server는 CTE를 구체화하지 않습니다 *"- "결코"믿기 어렵습니다. CTE의 크기가 사용 가능한 메모리를 초과하면 어떻게됩니까? –

+0

@a_horse_with_no_name. . . 예를 들어, 여기에 컴파일러 힌트 요청 (https://connect.microsoft.com/SQLServer/feedback/details/218968/provide-a-hint-to-force-intermediate-materialization-of)이 있습니다. -ctes-or-derived-tables). SQL Server에서 CTE는 단순히 코드를 쿼리로 정적으로 대체 한 것입니다. –