2017-07-21 6 views
1

Das Ziel besteht darin, Werte für id_num und county aus der Tabelle address_master zurückzugeben (address_master hat einen Datensatz pro ID), wenn BEID id_num AND county value nicht zurückgegeben wird Abfrage auf address_history:Gibt Datensätze aus der zweiten Tabelle zurück, wenn die Abfrage in der ersten Tabelle keine Datensätze zurückgibt

SELECT DISTINCT a.id_num, a.county FROM address_history a INNER JOIN (SELECT id_num, MIN(archive_job_tim) AS MaxEnrollDate FROM address_history GROUP BY id_num) b ON (a.id_num = b.id_num AND a.archive_job_tim = b.MaxEnrollDate) WHERE addr_cde = '*LHP'

Beispieldaten:

Tabelle address_history (enthält historische Veränderungen, mehrere Datensätze pro ID möglich sind)

id_num | county | archive_job_tim 
-------|--------|---------------- 
123 |012  |10/17/2001 10:48:38 
123 |NULL |10/17/2001 09:50:02 
123 |042  |11/17/2003 08:22:01 
134 |NULL |12/10/2005 02:14:23 
145 |534  |9/27/1996 00:00:00

Tabelle address_master (enthält nur die letzte Datensatz für jeden id)

id_num | county | archive_job_tim 
-------|--------|----------------- 
123 |563  |12/22/2015 10:29:01 
134 |734  |2/23/2005 07:21:15 
145 |943  |10/22/1996 06:24:13 
168 |012  |6/5/2017 08:01:22 
197 |NULL |7/1/2017 10:16:02

Abfrageergebnis sein sollte:

id_num | county 
-------|-------- 
123 |012 (because it is the earliest record with a county for this id in address_history) 
134 |734 (because the only record(s) in address_history has no county, returns record from address_master) 
145 |534 (because it is the earliest record with a county for this id in address_history) 
168 |012 (because no record exists in address_history for this id) 
197 |NULL (because no record exists in address_history for this id)

Jede Hilfe sehr geschätzt wird. Vielen Dank.

Antwort

1

Ich glaube, Sie suchen Abfrage wie folgt:

Select top (1) with ties * from 
(
    Select *,'am' as Note from address_master 
    union all 
    Select *,'ah' as Note from address_history 
) a where (a.Note = 'ah' and a.county is not null) or a.Note = 'am' 
Order by Row_Number() over(partition by id_num order by archive_job_tim) 

Ausgabe wie folgt:

+--------+--------+-------------------------+------+ 
| id_num | county |  archive_job_tim  | Note | 
+--------+--------+-------------------------+------+ 
| 123 | 12  | 2001-10-17 10:48:38.000 | ah | 
| 134 | 734 | 2005-02-23 07:21:15.000 | am | 
| 145 | 534 | 1996-09-27 00:00:00.000 | ah | 
| 168 | 12  | 2017-06-05 08:01:22.000 | am | 
| 197 | NULL | 2017-07-01 10:16:02.000 | am | 
+--------+--------+-------------------------+------+ 
+0

Danke Herr Kandasamy, aber ich erhalte eine Fehlermeldung, wie ich versuche, und verwenden Sie diese in der Befehlstext in einer Excel-Verbindung (wo ich normalerweise SQL für das Erzeugen verbundener Tabellen einfüge). Es heißt: [Microsoft] [SQL Server Native Client 10.0] [SQL Server] Falsche Syntax in der Nähe des Schlüsselwortes "von". – user3795203

+0

Aktualisierte Abfrage als eine Klammer fehlt in über() –

+0

Vielen Dank. Die Abfrage erzeugt jetzt Ergebnisse, sie gibt jedoch nur Zeilen von address_master zurück, und es sollten Datensätze für viele ID-Nummern in address_history vorhanden sein, die sich ergeben sollten. – user3795203

Verwandte Themen