我有以下查詢需要大約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
基本上,我正在通過所有診斷代碼搜索客戶端,以查看它是否是基於客戶端年齡的無效診斷代碼。
你必須有一個交叉連接,因爲你用逗號分隔的表列表並沒有包含在where子句中的連接謂詞。這是編寫查詢的不好方法。 http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx此外,它似乎在這裏有一些嚴重的規範化問題。你似乎有重複的團體違反1NF,並導致無數的痛苦。最後但並非最不重要的一點是,DATEDIFF函數不是有效的sql server語法。 –
不知道表格是什麼樣子以及你想要完成什麼,很難爲你重寫。但我必須說,它看起來寫得很差。我在想象你可以使用內部連接而不是交叉連接,而使用'WHERE x IN()'子句而不是大量的意外事件。 – Sturgus
我無法使用連接,因爲這會產生不想要的結果。客戶端有多個診斷代碼,必須存儲在不同的字段中,然後與另一個列表進行比較,該列表列出了一列中的所有診斷代碼。如果我插入一個連接,這個問題會給我帶來不必要的diag代碼,這些代碼不會綁定到客戶端。 – SikRikDaRula