2016-09-27 178 views
-2

我有以下查詢需要大約20-30秒才能生成結果。我想讓結果時間縮短,我在前端使用訪問來在後端創建查詢和SQL Server。不知道是否有更簡單的方法和更快的方式來運行此查詢。爲什麼我的查詢需要這麼長時間才能生成結果

這裏是我的查詢:

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])); 

這些都只是片段從表中,因爲這些都是大的表...

FIELDS FROM表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  

FIELDS自無效診斷代碼表:

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   

基本上,我正在通過所有診斷代碼搜索客戶端,以查看它是否是基於客戶端年齡的無效診斷代碼。

+2

你必須有一個交叉連接,因爲你用逗號分隔的表列表並沒有包含在where子句中的連接謂詞。這是編寫查詢的不好方法。 http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx此外,它似乎在這裏有一些嚴重的規範化問題。你似乎有重複的團體違反1NF,並導致無數的痛苦。最後但並非最不重要的一點是,DATEDIFF函數不是有效的sql server語法。 –

+1

不知道表格是什麼樣子以及你想要完成什麼,很難爲你重寫。但我必須說,它看起來寫得很差。我在想象你可以使用內部連接而不是交叉連接,而使用'WHERE x IN()'子句而不是大量的意外事件。 – Sturgus

+0

我無法使用連接,因爲這會產生不想要的結果。客戶端有多個診斷代碼,必須存儲在不同的字段中,然後與另一個列表進行比較,該列表列出了一列中的所有診斷代碼。如果我插入一個連接,這個問題會給我帶來不必要的diag代碼,這些代碼不會綁定到客戶端。 – SikRikDaRula

回答

1

沒有真正的細節可以使用,我完全猜測你想要什麼。但是使用別名並刪除所有額外的括號將會有相當大的幫助。我也用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 
    ) 
) 
+0

謝謝@Sean Lange,你的回答讓我得到了我需要的一些調整。這是我在3-5秒內返回的最終查詢。 – SikRikDaRula

0
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]))); 
相關問題