2016-01-26 16 views
0

我试图优化我的查询一点,我的想法是找到我正在寻找使用EXISTS子句的现有帐户。这是我想出了:凡存在优化

CREATE VIEW recruit_rev AS 
SELECT p.clinic, CONCAT(p.last_name, ', ', p.first_name) AS doctor, p.email, p.hire_date, p.practice_date, q.period_id, q.fiscal_year, SUM(t.amount) AS production 
FROM transactions t 
INNER JOIN provider p 
ON (t.clinic=p.clinic AND p.provider_id=t.provider_id) 
CROSS JOIN period q 
WHERE (t.time_ran BETWEEN q.period_start AND q.period_end) 
AND impacts='P' 
AND EXISTS (
     SELECT p.provider_id 
     FROM provider p 
     WHERE (p.clinic=t.clinic AND p.provider_id=p.provider_id) 
     AND p.position_id=1 
     AND p.email LIKE '%-Time%') 
GROUP BY p.clinic, p.email, p.hire_date, p.practice_date, q.period_id, q.fiscal_year, p.first_name, p.last_name 

但是这不工作,说我只用了过滤器的一部分,正常的查询,并没有EXISTS我的当前工作查询。

AND p.position_id=1 
AND p.email LIKE '%-Time%' 

任何洞悉我转错了方向?提前致谢。

+1

@MarkBannister'CONCAT'可用在SQL服务器2012+ – JamieD77

+0

你不能只是'内部联接周期q ON t.time_ran BETWEEN q.period_start和q.period_end'而不是'CROSS JOIN'? – JamieD77

+0

@ JamieD77:我不知道 - 谢谢你提供的信息。 –

回答

3

在这种情况下,不要在内部子查询和外部范围中使用相同的别名“p”。

AND EXISTS (
     SELECT p.provider_id 
     FROM provider p2 
     WHERE (p2.clinic=t.clinic AND p2.provider_id=p.provider_id) 
     AND p2.position_id=1 
     AND p2.email LIKE '%-Time%') 
0

,除非你不典型数据库设计和provider_idprovider表不是每行(供应商)唯一,你的查询应该可能只是这个样子。

SELECT p.clinic, 
     CONCAT(p.last_name,', ',p.first_name) AS doctor, 
     p.email, 
     p.hire_date, 
     p.practice_date, 
     q.period_id, 
     q.fiscal_year, 
     SUM(t.amount) AS production 
FROM transactions t 
     INNER JOIN provider p ON p.provider_id = t.provider_id) 
     INNER JOIN period q ON t.time_ran BETWEEN q.period_start AND q.period_end 
WHERE impacts = 'P' 
     AND p.position_id = 1 
     AND p.email LIKE '%-Time%' 
GROUP BY p.clinic, 
     p.email, 
     p.hire_date, 
     p.practice_date, 
     q.period_id, 
     q.fiscal_year, 
     p.first_name, 
     p.last_name 

你只会用EXISTS如果provider_id可以与不同的设置provider表多次,你要包括供应商如果有任何不同的设置,满足您的过滤