2017-04-17 76 views
0

如何获得更好的性能这个SQL查询使用交叉应用?如何获得更好的性能这个SQL查询?

SELECT DISTINCT TOP 10 acc.account_no 
     FROM account (NOLOCK) acc 
     CROSS APPLY(
     SELECT COUNT(1) AS piece 
     FROM account (NOLOCK) acc2 
     WHERE acc.account_no= acc2. account_no 
      AND status= 'P' 
    ) AS X 

     CROSS APPLY(
     SELECT COUNT(1) AS piece2 
     FROM account (NOLOCK) acc2 
     WHERE acc.account_no = acc2. account_no 
    ) AS Y 
    WHERE X.piece= Y.piece2 
+1

哪个RDBMS是这样的?请添加一个标签来指定您是使用'mysql','postgresql','sql-server','oracle'还是'db2' - 或者其他的东西。 –

+0

这是一个纯粹的猜测,但只要在WHERE子句中添加'AND acc.status ='P'',就可能取得成功。 –

回答

2

使用Group ByHaving

SELECT account_no 
FROM Account 
GROUP BY account_no 
HAVING Count(CASE 
       WHEN status = 'P' THEN 1 
      END) = Count(1) 
+0

我执行了你的查询,但花了更长的时间。我想用较少的行来改善性能。感谢您的回答。 – OKaradayi

+0

@OKaradayi你用'SELECT TOP 10'试过了吗? –

+0

@VojtěchDohnal是的,我做到了。 – OKaradayi

1

好像你需要在所有的状态是有价值的 'P' 的帐号。不知道你的TOP 10没有ORDER BY ...

SELECT DISTINCT TOP 10 account_no 
FROM Account a (NOLOCK) 
WHERE NOT EXISTS(
    SELECT 1 FROM account a1 (NOLOCK) WHERE a1.status <> 'P' AND a.Account_No = a1.Account_No) 
+2

这值得尝试。请注意,如果'status'曾经是'NULL',则需要调整子查询中的WHERE子句以处理该问题。 –

+0

在我的测试中(完全由数据组成),这是最高的。 +1 –