1

我需要运行查询以从数据库中获取一些数据。问题是我使用的查询有效但需要很长时间。

SELECT SHH1.CUST_NO,
       SHH1.CUST_NAME,
       ADDR.BVADDREMAIL 
FROM SALES_HISTORY_HEADER SHH1
INNER JOIN ADDRESS ADDR ON (SHH1.CUST_NO=ADDR.CEV_NO)
INNER JOIN CUSTOMER CUST ON (SHH1.CUST_NO=CUST.CUS_NO)
WHERE CUST.HOLD = 0
AND SHH1.CUST_NO IN (SELECT SHH2.CUST_NO 
                     FROM SALES_HISTORY_HEADER SHH2
                     GROUP BY SHH2.CUST_NO 
                     HAVING Max(SHH2.IN_DATE) < '20120101')
GROUP BY SHH1.CUST_NO,
         SHH1.CUST_NAME,
         ADDR.BVADDREMAIL

我不太擅长这个,所以想知道你们中的任何人是否可以帮助我?谢谢。

4

5 回答 5

0

我同意马克班尼斯特的回答,即 OP 应该这样FROM CUSTOMERFROM SALES_HISTORY_HEADER

所以,假设CUST_NAME是 on CUSTOMER,我会做以下事情:

SELECT CUST.CUS_NO,
       CUST.CUST_NAME,
       ADDR.BVADDREMAIL 
FROM CUSTOMER CUST
JOIN ADDRESS ADDR ON CUST.CUS_NO = ADDR.CEV_NO
WHERE CUST.HOLD = 0
AND CUST.CUS_NO IN (SELECT SHH.CUST_NO 
                    FROM SALES_HISTORY_HEADER SHH
                    GROUP BY SHH.CUST_NO 
                    HAVING Max(SHH.IN_DATE) < '20120101')

请注意,MySQL 必须激活子查询实现才能优化子选择。

于 2013-03-07T18:30:02.140 回答
0

在加入之前删除一些行怎么样

SELECT S.CUST_NO,
      ,S.Cust_NAME
      ,A.BVADDREMAIL
FROM CUSTOMER C
    INNER JOIN SALES_HISTORY_HEADER S ON (CUST.HOLD = 0 AND S.CUST_NO=C.CUS_NO)
        INNER JOIN ADDRESS A ON (S.CUST_NO=A.CEV_NO)
GROUP BY S.CUST_NO,S.CUST_NAME,A.BVADDREMAIL
HAVING Max(S.IN_DATE) < '20120101'

我对StevieG答案的更新

于 2013-03-07T20:53:56.393 回答
0

使用执行计划的哪一部分查询具有主要的执行成本。这很可能表明问题出在哪里。我将执行的下一步是查看索引创建。请记住,默认情况下,聚集索引是在 PK 上创建的,但在 FK 和您可能特别感兴趣的任何潜在字段上创建非聚集索引也是一个好习惯。希望能帮助到你。

于 2013-03-07T18:05:20.887 回答
0

我认为您不需要子选择。以下应该给你相同的结果:

SELECT SHH1.CUST_NO,SHH1.CUST_NAME,ADDR.BVADDREMAIL 
FROM SALES_HISTORY_HEADER SHH1
INNER JOIN ADDRESS ADDR ON (SHH1.CUST_NO=ADDR.CEV_NO)
INNER JOIN CUSTOMER CUST ON (SHH1.CUST_NO=CUST.CUS_NO)
WHERE CUST.HOLD = 0
GROUP BY SHH1.CUST_NO,SHH1.CUST_NAME,ADDR.BVADDREMAIL
HAVING Max(SHH1.IN_DATE) < '20120101'
于 2013-03-07T17:22:17.643 回答
0

假设CUST_NAME开启CUSTOMER,请尝试:

SELECT CUST.CUS_NO CUST_NO,
       CUST.CUST_NAME,
       ADDR.BVADDREMAIL 
FROM CUSTOMER CUST
JOIN ADDRESS ADDR ON CUST.CUS_NO=ADDR.CEV_NO
LEFT JOIN SALES_HISTORY_HEADER SHH 
       ON CUST.CUS_NO=SHH.CUST_NO AND SHH.IN_DATE >= '20120101'
WHERE CUST.HOLD = 0 AND SHH.CUST_NO IS NULL
GROUP BY CUST.CUS_NO, ADDR.BVADDREMAIL 
于 2013-03-07T17:53:42.627 回答