Sie sind nicht durch das Datum in irgendeiner Weise einzuschränken, die einen Teil Ihrer Anforderungen war. Ihre Abfrage benötigt nicht so viele verschachtelte Unterabfragen. Die PrivacyFlag
scheint nicht Teil Ihrer Frage zu sein, also habe ich es in diesem Beispiel nicht bearbeitet. Und Ihr Beispiel zeigt Primary Phone
, aber Ihre Frage spricht über Primary Address
, so dass ich nicht sicher bin, wie das funktioniert.
In jedem Fall ist hier ein sehr einfaches Beispiel, das die Daten zeigt, und wie den eine Datensatz mit dem neuesten Ablaufdatum und auch die neuesten Stichtag (in Fall gibt es zwei Datensätze mit demselben ziehen Haltbarkeitsdatum).
create table #temp (stu_id int, type varchar(10), address varchar(50), eff_date datetime, expr_date datetime)
insert into #temp values
(1, 'primary', '123 NW 52nd', '1/1/2016', '1/1/1900'),
(1, 'primary', '942 SE 33rd', '1/2/2016', '12/31/2016'),
(1, 'primary', '721 SW 22nd', '4/1/2015', '1/1/1900')
select top 1 *
from (
select stu_id
,type
,address
,eff_date
,case when expr_date = '1/1/1900' then '12/31/2100' else expr_date end as expr_date
from #temp
where stu_id = 1
and type = 'primary'
) as a
where getdate() between eff_date and expr_date
order by a.expr_date desc, a.eff_date desc
drop table #temp
Sie könnten sogar mit Null Unterabfragen es tun, aber dann würden Sie müssen die case
Anweisung in die where
und order by
Teile der Abfrage duplizieren:
select top 1
stu_id
,type
,address
,eff_date
,case when expr_date = '1/1/1900' then '12/31/2100' else expr_date end as expr_date
from #temp
where stu_id = 1
and type = 'primary'
and getdate() between eff_date and case when expr_date = '1/1/1900' then '12/31/2100' else expr_date end
order by case when expr_date = '1/1/1900' then '12/31/2100' else expr_date end desc
,eff_date desc
Mit einem so kleinen Datensatz, der showplan
nicht angibt, welche Abfrage am effizientesten wäre; Es zeigte denselben identischen Abfrageplan für beide Abfragen, außer dass die erste select
-Anweisung sieben CPU-Zyklen benötigte, um den Plan zu kompilieren, und die zweite select
-Anweisung zwei CPU-Zyklen benötigte, um den Plan zu kompilieren. Sie möchten vielleicht einen größeren Datensatz in realen Tabellen mit Indizes usw. testen und sehen, welcher der beste ist.
Bitte folgen Sie den Buchungsrichtlinien in der Hilfe. [Minimales, vollständiges, überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) gilt hier. "In einigen Fällen nicht funktionieren" ist keine Problembeschreibung. – Prune
Wo ist 'Primäradresse' in Ihrer Abfrage? Ich sehe nicht, wo du es benutzt hast – FLICKER