0

我有这样的声明:

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

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

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

LONG LIST OF EMAILS即:'abc@domain.com','def@domain.com',。. . 'xyz@domain.com'

如您所见,我在此查询中重复了部分子查询。

我想知道是否以及如何替换LONG LIST OF EMAILS. 它在我的陈述中出现了两次。是否可以编辑此查询,以便提到的内容LONG LIST OF EMAILS发生一次?

4

3 回答 3

2

使用 WITH 子句:

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);
于 2012-12-14T10:06:49.710 回答
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
于 2012-12-14T10:07:10.677 回答
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 和 email 的行

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;
于 2012-12-14T10:10:05.583 回答