2017-04-17 5 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

これは純粋な推測ですが、 'AND acc.status = 'P''を' WHERE'節に追加するだけで成功するかもしれません。 –

答えて

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' である口座番号を必要とするように思えます。あなたのトップ10は注文なしではわかりません...

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 –

関連する問題