2012-12-14 3 views
0

나는이 문장이있다. . . '[email protected]'SQL 문 최적화

이 쿼리에서 하위 쿼리의 일부를 반복합니다.

LONG LIST OF EMAILS을 어떻게 대체 할 수 있는지 궁금합니다. 그것은 내 진술에서 두 번 발생합니다. 언급 된 LONG LIST OF EMAILS가 한 번 발생하도록이 쿼리를 편집 할 수 있습니까?

+1

으로 검출 될 수있다. 어떻게 작동하는지 쉽게 알기 쉽습니다. – dtech

+1

기타 : 해당 이메일이 검색어에 직접 표시되는 이유는 무엇입니까? 동일한 데이터베이스에 저장되지 않습니까? 쿼리에서 리터럴을 포함하지 않으면 – dtech

+1

위의 쿼리를 사용하여 반환하려는 내용을 설명 할 수 있습니까? –

답변

1

첫째, 당신은 충분하다

IN (SELECT DISTINCT kun_id 
    FROM sgtn, kun 
    WHERE kun.kun_e_mail IN (LONG LIST OF EMAILS) 
    AND sgtn_kun_id = kun_id) 

를 사용할 필요가 없습니다

IN (SELECT kun_id 
    FROM kun 
    WHERE kun.kun_e_mail IN (LONG LIST OF EMAILS)) 
목록에 여러 sgtn_strasse 이메일을 가진

행은 서브 쿼리의 및 IN의 결합으로, 그들은 훨씬 * 더 효율적 *이 경우 동일한 결과를 달성하고있다 할 수 있습니다 교체

select * from (
    SELECT s.*, count(*) over (partition by sgtn_strasse) cnt_strasse 
    FROM sgtn s 
    WHERE sgtn_kun_id IN (SELECT kun_id 
         FROM kun 
         WHERE kun.kun_e_mail IN (LONG LIST OF EMAILS)) 
) 
WHERE cnt_strasse > 1; 
2

절과 함께 사용

WITH kun_list AS (
    SELECT DISTINCT kun_id 
     FROM sgtn, kun 
    WHERE kun.kun_e_mail IN (LONG LIST OF EMAILS) 
      AND sgtn_kun_id = kun_id) 

SELECT * 
    FROM sgtn 
WHERE sgtn_kun_id IN (SELECT kun_id 
         FROM kun_list) 

     AND sgtn_strasse IN (SELECT sgtn.sgtn_strasse 
           FROM sgtn 
          WHERE sgtn_kun_id IN (SELECT kun_id 
                FROM kun_list) 

          GROUP BY sgtn.sgtn_strasse 
          HAVING COUNT(sgtn_strasse) > 2); 
+0

을 제공하는 경우 전자 메일 목록 복제에 엄격하게 응답하지만 성능 향상은 제공하지 않으므로 본질적으로 OP에서. –

1

당신이 시도 할 수 있습니다 :

with CTE as (
SELECT sgtn.*, count(sgtn_strasse) OVER (PARTITION BY sgtn_strasse) cnt 
FROM sgtn 
WHERE sgtn_kun_id IN (SELECT kun_id FROM kun 
         WHERE kun.kun_e_mail IN (LONG LIST OF EMAILS)) 
) 

SELECT * FROM CTE WHERE CNT > 2 
+0

수정해야 할 두 가지 :'sgtn_kun_id IN (SELECT *'부분과 cte는'kun_id' 열이 없습니다.) –

+0

이제는 괜찮습니다. –