为什么我的查询需要很长时间才能产生结果

Why does my Query take so long to produce result

我有以下查询,大约需要 20-30 秒才能产生结果。我想减少结果时间,我在前端使用访问权限来创建查询,在后端使用 SQL 服务器。不确定 运行 此查询是否有更简单快捷的方法。

这是我的查询:

SELECT DISTINCT 
    [UB-04s].client_id, 
    DATEDIFF("yyyy", [UB-04s]![patient_dob], [UB-04s]![admit_date]) AS [AGE at Admission], 
    invalid_diag_codes_by_age.start_age_yrs, 
    invalid_diag_codes_by_age.end_age_yrs, 
    invalid_diag_codes_by_age.diag_code 
INTO 
    tmp10407
FROM 
    [UB-04s], invalid_diag_codes_by_age
WHERE 
    ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].dx_Q)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
    AND (([UB-04s].dx_P)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
   AND (([UB-04s].dx_O)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
   AND (([UB-04s].dx_N)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
   AND (([UB-04s].dx_M)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
   AND (([UB-04s].dx_L)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
   AND (([UB-04s].dx_K)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
   AND (([UB-04s].dx_J)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
   AND (([UB-04s].dx_I)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
   AND (([UB-04s].dx_H)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
   AND (([UB-04s].dx_G)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
   AND (([UB-04s].dx_F)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
   AND (([UB-04s].dx_E)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
   AND (([UB-04s].dx_D)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
   AND (([UB-04s].dx_C)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
   AND (([UB-04s].dx_B)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
   AND (([UB-04s].dx_A)=[invalid_diag_codes_by_age].[diag_code])) OR ((([UB-04s].client_id)=[Forms]![frmUB04s]![client_id]) 
   AND (([UB-04s].principal_dx)=[invalid_diag_codes_by_age].[diag_code]));

这些只是 TABLES 的片段,因为它们很大 TABLES...

来自 TABLE UB04s 的字段:

client_id   principal_dx    dx_A    dx_B    dx_C    dx_D    dx_E    dx_F    dx_G    dx_H    dx_I    dx_J    dx_K    dx_L    dx_M    dx_N    dx_O    dx_P    dx_Q
527                                                                     
530     42843   4280    4148    41519   42741   4271    5849    5770    5739        99702   431 2760    44422   28981   28984   2384    78551   42611
531     5715    44489   34839   0785    99682   4589    5723    2762    42518       99779   99811   5180    2689    2769    57142   5680    4471    2894
533     5559    V145                                                                
116     2761    7802    4019    2724    V1582   2768                                                
117     55321       

来自无效诊断代码的字段 TABLE:

diag_code   start_age_yrs   end_age_yrs age_range_desc  
04041           0               0.5         0-6 months of age       
27701           0                1          
3070           18                99         
99779           0                1          
5559           15                99         

基本上我正在做的是搜索客户的所有诊断代码,根据客户的年龄查看它是否是无效的诊断代码。

没有真正的细节可以使用,我完全在猜测你想要什么。但是使用别名并删除所有额外的括号会有很大帮助。我还使用 IN 代替重复谓词。这不会完全像这样工作,但非常接近。

SELECT DISTINCT u.client_id
    , DateDiff(year, [UB-04s]![patient_dob], [UB-04s]![admit_date]) AS [AGE at Admission]
    , i.start_age_yrs
    , i.end_age_yrs
    , i.diag_code 
INTO tmp10407
FROM [UB-04s] u
cross join invalid_diag_codes_by_age i
WHERE u.client_id = [Forms]![frmUB04s]![client_id] 
AND 
(
    u.dx_Q = i.diag_code
) 
OR 
(
    u.principal_dx = i.diag_code
    AND
    i.diag_code in 
    (
        u.dx_P
        , u.dx_O
        , u.dx_N
        , u.dx_M
        , u.dx_L
        , u.dx_K
        , u.dx_J
        , u.dx_I
        , u.dx_H
        , u.dx_G
        , u.dx_F
        , u.dx_E
        , u.dx_D
        , u.dx_C
        , u.dx_B
        , u.dx_A
    )
)
SELECT DISTINCT u.client_id, DateDiff("yyyy",u.patient_dob,u.admit_date) AS [AGE at Admission], i.start_age_yrs, i.end_age_yrs, i.diag_code INTO tmp10407
FROM [UB-04s] AS u, invalid_diag_codes_by_age AS i
WHERE (((u.client_id)=[Forms]![frmUB04s]![client_id]) 
AND ((i.diag_code) In ([u].[dx_P],[u].[dx_O],[u].[dx_N],[u].[dx_M],[u].[dx_L],[u].[dx_K],[u].[dx_J],[u].[dx_I],[u].[dx_H],[u].[dx_G],[u].[dx_F],[u].[dx_E],[u].[dx_D],[u].[dx_C],[u].[dx_B],[u].[dx_A]))) 
OR (((u.client_id)=[Forms]![frmUB04s]![client_id]) 
AND ((u.principal_dx) In ([i].[diag_code])));