필자는 테이블에서 모든 ID를 선택하여 일부 ID를 'backblaze sales orders'로 필터링하도록 비교합니다. 보고서를 확인할 때마다 10 초가 걸린다는 것을 알았습니다. 얼마나 효율적으로 테이블을 반복해서 쿼리하지 않도록 비교할 수있는 변수로 테이블을 선택할 수 있습니까?두 번 사용할 수 있도록 쿼리를 변수에 저장하려면 어떻게해야합니까?
지금까지 나는 폴 응답의 temp_table을 사용했지만 "재 테스트 할 수는 없습니다"라는 오류 메시지가 나타납니다.
CREATE TEMPORARY TABLE if not exists TempTable (id varchar(36));
INSERT INTO TempTable (id)
SELECT
id
FROM
reporting.backblaze_sales_orders;
SELECT
2011 as year,
so.technical_address_country,
so.technical_address_state,
/* ALL JOBs */
COUNT(so.id) as all_sales,
COUNT(mf.id) as all_jobs,
SUM(so.total_value) as all_value,
SUM(IF(so.check_if_new_customer=1,1,0)) as sales_order_new,
SUM(IF(so.check_if_new_customer = 1,so.total_value,0)) as total_value_new,
SUM(IF(so.check_if_new_customer=1 AND mf.id IS NOT NULL,1,0)) as jobs_new,
SUM(IF(so.check_if_new_customer=0,1,0)) as sales_order_existing,
SUM(IF(so.check_if_new_customer = 0,so.total_value,0)) as total_value_existing,
SUM(IF(so.check_if_new_customer=0 AND mf.id IS NOT NULL,1,0)) as jobs_existing,
/* ALL JOBs */
COUNT(so.id) as all_sales_back_blaze,
COUNT(mf.id) as all_jobs_back_blaze,
SUM(so.total_value) as all_value,
SUM(IF(so.check_if_new_customer=1 AND so.id not in (SELECT id from TempTable) ,1,0)) as sales_order_new_back_blaze,
SUM(IF(so.check_if_new_customer = 1 AND so.id not in (SELECT id from TempTable),so.total_value,0)) as total_value_new_back_blaze,
SUM(IF(so.check_if_new_customer=1 AND mf.id IS NOT NULL AND so.id not in (SELECT id from TempTable),1,0)) as jobs_new_back_blaze,
SUM(IF(so.check_if_new_customer=0 AND so.id not in (SELECT id from TempTable),1,0)) as sales_order_existing_back_blaze,
SUM(IF(so.check_if_new_customer = 0 AND so.id not in (SELECT id from TempTable),so.total_value,0)) as total_value_existing_back_blaze,
SUM(IF(so.check_if_new_customer=0 AND mf.id IS NOT NULL AND so.id not in (SELECT id from TempTable),1,0)) as jobs_existing_back_blaze
FROM
sugarcrm2.so_order so
LEFT JOIN
sugarcrm2.mf_job mf on so.id = mf.sales_order_id
WHERE
so.date_entered > "2010-10-30" AND so.date_entered >"2011-10-30" AND
so.technical_address_country IS NOT NULL AND
so.technical_address_state IS NOT NULL AND
so.deleted = 0 AND
so.has_been_promoted = 1
GROUP BY
YEAR(so.date_entered),
so.technical_address_country,
so.technical_address_state
ORDER BY
so.technical_address_country, so.technical_address_state
첫 번째 대답은 MSSQL에서만 작동하며 MySQL 용으로 업데이트되었습니다. –
이 테이블을 어떻게 쿼리합니까? – davidahines
그래서 당신이 제안한 것처럼 유혹을 사용하려고 쿼리를 변경했지만 '유인'이 이미 있다는 것을 알려주므로 'temptable1'로 변경하고 나에게도 같은 오류가 발생합니다. 편집 된 예제에서 코드 상단에 있습니다. – davidahines