2017-06-08 3 views
0

Ich brauche eine neue Reihe von Augen auf diese Abfrage. Ohne in diesem Code mega tief zu gehen, ist mein Problem, dass ich eine linke Verknüpfung mache, um aus der TXP_Digital_Signatures (tds) -Tabelle zu ziehen, die Signaturen auf die aktuellste Version von Behandlungsplänen (txp_master txp) speichert. Was dieser Code macht, bringt Ergebnisse zurück, wobei tds.signed null (keine Signatur) oder mit N (Nein) markiert ist. Das funktioniert, aber was dieser Bericht getan hat, ist Leuten zu zeigen, welche No's ja werden müssen, aber das lässt das Nein zurück, also wenn es ein jüngeres Ja gibt, dann ist das Nein in dieser Version der tds.plan_id immer noch ziehe die plan_id dorthin, wo ich sie nicht mehr haben möchte, wo der letzte Signaturstatus ein Y (yes) usw. ist. Der unten stehende Codeausschnitt fügt der where-Anweisung hinzu, verbirgt aber alle No's, auch wenn es kein neueres Y gibt (ja).Verwenden einer korrelierten Unterabfrage in einem linken Join

tds.date = (select Max(date) from TXP_Digital_Signatures where tds.plan_id = txp.plan_id) 

Kann jemand denken Sie an einen Weg, um eine korrelierte Unterabfrage auf der linken Seite kommen, um entweder mehr, so dass es nur die max (tds.date) für jede tds.plan_id zieht oder wie meine, wo Aussagen zu überarbeiten, so dass die Neins ohne ein neueres ja und die nulls zeigen sich immer noch. Ich möchte wirklich nicht den ganzen Bericht als einen gruppierten Bericht wiederholen, wenn ich ihm helfen kann, wo ich fühle, dass es eine Menge Zeug auf mir brechen wird, und im Grunde habe ich diesen Bericht von Grund auf neu erstellen. SQL 2008 R2

SELECT case_status, 
    CONVERT(CHAR(10), episode_open_date, 101)AS 'Enrolled' , 
    txp.patient_id, 
    p.lname+', ' + p.fname AS 'Client', 
    CONVERT(CHAR(10), txp.effective_date, 101)AS 'Effective', 
    CONVERT(CHAR(10), next_review_date, 101)AS 'Review', 
    txp.signed, 
    (SELECT location_code FROM staff s WHERE s.staff_id = txp_coordinator_id) AS 'Clinic', 
    (SELECT s.lname+', ' +s.fname FROM staff s WHERE s.staff_id = txp_coordinator_id) AS 'Coordinator', 
    (SELECT s.lname+', ' +s.fname FROM staff s WHERE s.staff_id = ts.team_member_id) AS 'Team', 
    ts.signed, 
    tds.signed as 'Patient Sig' 
FROM txp_master txp join patient p ON p.patient_id = txp.patient_id and p.episode_id = txp.episode_id 
    join txp_signature ts on ts.plan_id = txp.plan_id and ts.version_no = txp.version_no and ts.team_member_id <> txp.txp_coordinator_id 
    left join TXP_Digital_Signatures tds on tds.plan_id = txp.plan_id 

where p.case_status = 'A' and 
txp.status <> 'er' and patient_signed_date is null 
and tds.signed is null or tds.signed = 'N' 
and txp.effective_date > '2016-12-31 00:00:00.000' 
and tds.date = (select Max(date) from TXP_Digital_Signatures where tds.plan_id = txp.plan_id) 

order by patient_id 

Antwort

2

Ihre Abfrage sollte funktionieren, wenn Sie die Unterabfrage zu korrigieren, wie folgt aus:

(select Max(date) from TXP_Digital_Signatures x where x.plan_id = tds.plan_id) 

zur Zeit, Sie sind nicht Filtern der Unterabfrage TXP_Digital_Signatures.

Eine andere Sache zur Kenntnis zu nehmen ist, dass Sie eine LEFT JOIN auf TXP_Digital_Signatures tds noch haben Sie es auf die WHERE Klausel. Dies wird es in eine INNER JOIN konvertieren. Entscheide dich also für den Beitritt und ändere entsprechend.

Wenn Sie Ergebnisse unabhängig von TXP_Digital_Signatures tds möchten, dann verschieben Sie diese Bedingungen in die ON Klausel. Vielen Dank für die Antwort

Wenn Sie nur wollen Ergebnisse basierend auf TXP_Digital_Signatures tds dann INNER JOIN

+0

ändern. Ich bin ein wenig verwirrt. Wo stelle ich die Unterabfrage? Nur in der Auswahl? Das zeigt an, wie hoch das maximale Datum ist, aber es verbirgt die N Ergebnisse nicht mit einem neueren Ja in den Ergebnissen. Ich bin auch ein wenig verwirrt darüber, wie du willst, dass ich meine Runde umstelle. Ich möchte Ergebnisse unabhängig von TXP_Digital_signatures, wo ich die Null-Ergebnisse, die keine Signatur haben, aber nicht genau, was Sie von Ihrer Beschreibung zu ändern brauchen. Danke und Entschuldigung, ich bin ein Code-Noob. –

+2

Der Vorschlag ist, dass die letzte Zeile Ihres Codes so aussehen sollte. Das Problem mit dem von Ihnen geposteten Code ist, dass 'tds' nicht auf die Instanz von TDS in dieser Unterabfrage verweist, sondern auf die im Hauptteil der Abfrage. Es braucht einen eigenen Alias. –

+0

Jede 'WHERE'-Klausel, die auf tds verweist (außer' tds.field = NULL'), filtert Fälle aus, in denen kein TDS-Datensatz vorhanden ist. Wenn Sie das nicht möchten, müssen Sie diese Zeilen in die ON-Klausel für den entsprechenden JOIN verschieben. –

Verwandte Themen