나는이 문장이있다. . . '[email protected]'SQL 문 최적화
이 쿼리에서 하위 쿼리의 일부를 반복합니다.
LONG LIST OF EMAILS
을 어떻게 대체 할 수 있는지 궁금합니다. 그것은 내 진술에서 두 번 발생합니다. 언급 된 LONG LIST OF EMAILS
가 한 번 발생하도록이 쿼리를 편집 할 수 있습니까?
나는이 문장이있다. . . '[email protected]'SQL 문 최적화
이 쿼리에서 하위 쿼리의 일부를 반복합니다.
LONG LIST OF EMAILS
을 어떻게 대체 할 수 있는지 궁금합니다. 그것은 내 진술에서 두 번 발생합니다. 언급 된 LONG LIST OF EMAILS
가 한 번 발생하도록이 쿼리를 편집 할 수 있습니까?
첫째, 당신은 충분하다
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;
절과 함께 사용
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);
을 제공하는 경우 전자 메일 목록 복제에 엄격하게 응답하지만 성능 향상은 제공하지 않으므로 본질적으로 OP에서. –
당신이 시도 할 수 있습니다 :
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
수정해야 할 두 가지 :'sgtn_kun_id IN (SELECT *'부분과 cte는'kun_id' 열이 없습니다.) –
이제는 괜찮습니다. –
으로 검출 될 수있다. 어떻게 작동하는지 쉽게 알기 쉽습니다. – dtech
기타 : 해당 이메일이 검색어에 직접 표시되는 이유는 무엇입니까? 동일한 데이터베이스에 저장되지 않습니까? 쿼리에서 리터럴을 포함하지 않으면 – dtech
위의 쿼리를 사용하여 반환하려는 내용을 설명 할 수 있습니까? –