Ich habe die folgende Abfrage, die etwa 20-30 Sekunden dauert, um ein Ergebnis zu produzieren. Ich möchte die Ergebniszeit runterziehen, ich benutze Zugriff auf das Frontend, um Abfragen und SQL Server auf dem Backend zu erstellen. Nicht sicher, ob es einen einfacheren Weg und einen schnelleren Weg zum Ausführen dieser Abfrage gibt.Warum dauert meine Abfrage so lange, bis das Ergebnis
Hier ist meine Frage:
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]));
THESE gerade aus den Tabellen sind SCHNIPSEL AS THESE große Tische ...
SINDFelder der Tabelle 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
Felder aus INVALID DIAG CODES 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
Im Grunde durchsuche ich alle Diagnosecodes für einen Client, um festzustellen, ob es sich um einen ungültigen Diagnosecode basierend auf dem Alter des Clients handelt.
Sie haben ein Kreuz in es kommen, weil Sie eine durch Kommata getrennte Liste von Tabellen verwendet, und umfassen nicht die Joinvergleichselemente in der where-Klausel. Dies ist eine schlechte Möglichkeit, Abfragen zu schreiben. http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx Auch scheint es, dass Sie einige ernsthafte Normalisierungsprobleme haben hier. Sie scheinen sich wiederholende Gruppen zu haben, die gegen 1NF verstoßen und unzählige Schmerzen verursachen. Zu guter Letzt ist die DATEDIFF-Funktion keine gültige SQL-Server-Syntax. –
Ohne zu wissen, wie die Tabellen aussehen und was Sie erreichen möchten, wäre es schwierig, dies für Sie neu zu schreiben. Aber ich muss sagen, dass es sehr schlecht geschrieben scheint. Ich stelle mir vor, dass Sie anstelle einer Kreuzverbindung eine innere Verbindung verwenden können und anstelle Ihrer riesigen Liste von Kontingenzen eine Klausel "WHERE x IN()". – Sturgus
Ich kann keinen Join verwenden, da dies zu unerwünschten Ergebnissen führen würde. Kunden haben mehrere Diagnosecodes, die in separaten Feldern gespeichert werden müssen, die dann mit einer anderen Tabelle verglichen werden, die alle Diagnosecodes in einer Spalte auflistet. Das Problem, wenn ich einen Beitritt einfüge, gibt es mir unnötige diag Codes, die nicht an den Klienten gebunden sind. – SikRikDaRula