3

私は時間の最高の組み合わせを選択するSQLクエリを持っています。

Declare @EmpClasses table(Id int identity(1,1),ClassNum int,ClassWeight int,ClassHours int)
Declare @HoursReq int;

SET @HoursReq = 20;


    INSERT INTO @EmpClasses VALUES(1001,10,10),(1002,9,5),(1003,8,4),(1004,7,3),(1005,6,2),(1006,5,2),(1007,4,1);

    --INSERT INTO @EmpClasses VALUES(1001,2,2),(1002,2,2),(1003,2,2),(1004,2,2),(1005,2,2),(1006,2,2),(1007,2,2),(1008,2,2),(1009,2,2),(1010,2,2);
    --INSERT INTO @EmpClasses VALUES(1011,2,2),(1012,2,2),(1013,2,2),(1014,2,2),(1015,2,2),(1016,2,2),(1017,2,2),(1018,2,2),(1019,2,2),(1020,2,2);
    --INSERT INTO @EmpClasses VALUES(1021,2,2),(1022,2,2),(1023,2,2),(1024,2,2),(1025,2,2),(1026,2,2),(1027,2,2),(1028,2,2),(1029,2,2),(1030,2,2);


    WITH cte (Id,comIds,Total,TotalWeight)
    AS
    (
    SELECT Id
            ,Cast(ClassNum as varchar(max)) + ','
            ,ClassHours
            ,ClassWeight
    FROM @EmpClasses
    UNION ALL
    SELECT ec.Id
            ,cte.comIds + Cast(ec.ClassNum as varchar(max)) + ','
            ,cte.Total + ec.ClassHours
            ,cte.TotalWeight + ec.ClassWeight
    FROM @EmpClasses AS ec JOIN cte ON ec.Id < cte.Id
    )
    SELECT top(1)comids,Total,TotalWeight
    FROM cte 
    Where Total = @HoursReq 
    order by TotalWeight desc

ただし、反復するために行数が増えると、問題があります。非常に時間がかかります。注:- 上記の行のコメントを外して、問題を確認してください

これに関するヘルプは大歓迎です

4

1 に答える 1

1

で生成される行数はcte次のとおりです。2^n-1ここで、nは@EmpClassesテーブル内のレコード数です。

したがって、7つのレコードだけを使用すると、127のレコードが生成されます。

ただし、完全な例のように37レコードを使用する場合は、137.438.953.471行を生成する必要があります。高速サーバーを使用している場合でも、これには時間がかかります。

簡単な方法で、CTEの下部にある選択を変更したかどうかを確認できます

select * from cte
于 2011-11-07T12:12:20.023 に答える