-1

私はテーブルを持っています

表1

epid        etid        id          EValue       reqdate
----------- ----------- ----------- ------------ ----------
15          1           1           498925307069 2012-01-01
185         1           2           A5973FC43CE3 2012-04-04
186         1           2           44C6A4B776A2 2012-04-05
205         1           2           7A0ED3F1DA13 2012-09-19
206         1           2           77771D65F9C4 2012-09-19
207         1           2           AD74A4AA41BD 2012-09-19
208         1           2           9595ABE5A0C8 2012-09-19
209         1           2           7611D2FB395B 2012-09-19
210         1           2           04A510D6067A 2012-09-19
211         1           2           24D43EC268F8 2012-09-19

テーブル2

PEId        Id          EPId
----------- ----------- -----------
43          9           15
44          10          15
45          11          15
46          12          15
47          13          15
48          14          15
49          15          15
50          16          15
51          17          15
52          18          15

テーブル3

PLId        PEId        Id          ToPayId
----------- ----------- ----------- -----------
71          43          9           1
72          43          9           2
73          44          10          1
74          44          10          2
75          45          11          1
76          45          11          2
77          46          12          1
78          46          12          2
79          47          13          1
80          47          13          2

テーブル 3 でカウントが 8 未満の id を 1 つ取得し、テーブル 2 で peid で並べ替えたいのですが、

クエリを書きました

SELECT Top 1  ToPayId FROM 
(
    SELECT Count(pl.ToPayId) C, pl.ToPayId 
    FROM table3 pl 
    INNER JOIN table2 pe ON pl.peid = pe.peid 
    INNER JOIN table1 e ON pe.epid = e.epid
    WHERE e.EtId=1 GROUP BY pl.ToPayId 
) As T 
INNER JOIN table2 p ON T.ToPayId= p.Id 
WHERE C < 8 ORDER BY p.PEId ASC

このクエリは、while 条件を使用する user-defined-table-type のエントリに応じて、ストアド プロシージャで 1000 回以上実行されます。

しかし、各テーブルに何百万ものエントリがあるため、非常に低速です。

上記に関するより良いクエリを提案できる人はいますか?

4

2 に答える 2

0

..十分なサンプルデータを提供しなかったため、ビジネスロジックが正確に何であるかわかりません。盲目的にコードを変更できるように。

SELECT ToPayId 
FROM (

    SELECT TOP 1 Count(pl.ToPayId) C, pl.ToPayId, pe.PEId
    FROM table3 as pl 
        INNER JOIN table2 as pe ON pl.peid = pe.peid AND pl.ToPayId = pe.Id
        INNER JOIN table1 e ON pe.epid = e.epid
    WHERE e.EtId=1
    GROUP BY pl.ToPayId, pe.PEId 
    HAVING Count(pl.ToPayId) < 8
    ORDER BY pe.PEId ASC    

) AS T
于 2012-12-06T10:55:05.173 に答える
0

from select を取り除くために、having 句を試してみてください。

select table2.id as due
      from table3 inner join table2 on table2.PEId=table3.PEId...
      group by ...
      having count(due) <8
      order by ...

-> table3 に冗長な Id 列があります: PEId と Id のペアが一意に見えるため、かなり役に立たないようです。削除して、テーブル 3 のサイズを 25% 縮小し、db のパフォーマンスを向上させます。

于 2012-12-06T09:23:14.200 に答える