Select name, mdate, kdate
from table1 a
inner join (
select name, mdate
from table2 b
where a.id = b.id
and mdate >= kdate
union
select name, mdate
from table3 c
where a.id = c.id
and mdate >= kdate
) mindate
When the select mdate from the inner join union (mindate) returns the
same mdate for table b and c, I want to give preference to the c.mdate
and so c.name.
Is there a way to do this?
thanks!
regards,
Erwin
Can you expand more on this and if possible post some DDL, sample data and
expected result?
The derive table is being built using a UNION operator, so if both rows (b
and c) have same ([name], [mdate]) then just one row will result. why give a
preference if they are equal?
Also, use table alias to qualify columns in your derived table. SQL Server
will use the outer ones instead. Are you aware of the "cross join" operation?
Select mindate.name, mindate.mdate, a.kdate
from table1 a
inner join (
select b.name, b.mdate
and b.mdate >= a.kdate
union
select c.name, c.mdate
and c.mdate >= a.kdate
) mindate
AMB
The shown query is a very simplified version of my query.
In the query shown underneath the last inner join selects the
min(date) from the union. When two dates are equal I need the red_fct
from the table DWH_TB_GEG_INSTRUMENT_EARLY_REDEMPTION.
select distinct
DWH_TB_GEG_INSTRUMENT_MASTER.instrument_ODS_ID as
instrument_ODS_ID,
duration_type_cde,
duration_dte,
red_fct,
DWH_TB_GEG_PORTFOLIO_POSITION.position_NAV_dte,
DWH_TB_GEG_INSTRUMENT_MASTER.interest_rate_pct/100 as
interest_rate_pct,
DWH_TB_GEG_INSTRUMENT_DETAIL.instrument_price_euro_amt as
instrument_price_euro_amt
from DWH_TB_GEG_INSTRUMENT_MASTER
inner join DWH_TB_GEG_PORTFOLIO_POSITION on
DWH_TB_GEG_INSTRUMENT_MASTER.instrument_ODS_ID =
DWH_TB_GEG_PORTFOLIO_POSITION.instrument_ODS_ID
inner join DWH_TB_GEG_INSTRUMENT_DETAIL on
DWH_TB_GEG_INSTRUMENT_MASTER.instrument_ODS_ID =
DWH_TB_GEG_INSTRUMENT_DETAIL.instrument_ODS_ID
inner join DWH_TB_GEG_DAY on
DWH_TB_GEG_PORTFOLIO_POSITION.position_NAV_dte =
DWH_TB_GEG_DAY.day_dte
and DWH_TB_GEG_INSTRUMENT_DETAIL.dte = DWH_TB_GEG_DAY.dte
inner join (
select im.instrument_ods_id, 'I' as duration_type_cde,
ia.INTEREST_DTE as duration_dte, 100.00 as red_fct -- Bij max altijd
uitgaan van 100% redemption
from DWH_TB_GEG_INSTRUMENT_MASTER im
inner join DWH_TB_GEG_INSTRUMENT_INTEREST_ADJUSTMENT ia on
im.instrument_ODS_ID = ia.INSTRUMENT_ID
union
select im.instrument_ods_id, 'I' duration_type_cde,
er.WITHDRAWAL_DTE, er.WITHDRAWAL_FCR as red_fct
from DWH_TB_GEG_INSTRUMENT_MASTER im -- Hier joinen met early
redemption tabel op id en datum voor verkrijgen factor
inner join DWH_TB_GEG_INSTRUMENT_EARLY_REDEMPTION er on
im.instrument_ODS_ID = er.INSTRUMENT_ID
) dt_i on DWH_TB_GEG_INSTRUMENT_MASTER.instrument_ods_id =
dt_i.instrument_ods_id
and dt_i.duration_dte =
(
select min(duration_dte) from
(
select ia2.INTEREST_DTE as duration_dte
from DWH_TB_GEG_INSTRUMENT_MASTER im2
inner join DWH_TB_GEG_INSTRUMENT_INTEREST_ADJUSTMENT ia2 on
im2.instrument_ODS_ID = ia2.INSTRUMENT_ID
where im2.instrument_ods_id = dt_i.instrument_ods_id
and ia2.INTEREST_DTE >=
DWH_TB_GEG_PORTFOLIO_POSITION.position_NAV_dte
union
select er2.WITHDRAWAL_DTE
from DWH_TB_GEG_INSTRUMENT_MASTER im2
inner join DWH_TB_GEG_INSTRUMENT_EARLY_REDEMPTION er2 on
im2.instrument_ODS_ID = er2.INSTRUMENT_ID
where im2.instrument_ods_id = dt_i.instrument_ods_id
and er2.WITHDRAWAL_DTE >=
DWH_TB_GEG_PORTFOLIO_POSITION.position_NAV_dte
) mindate
)
***untested***
Select name, mdate, kdate
from table1 a
inner join (
select name, mdate
from table2 b
where a.id = b.id
and mdate >= kdate
and not exists (select *
from table3 d
where a.id = d.id
and d.mdate >= a.kdate
and d.mdate = b.mdate)
HTH,
Plamen Ratchev
http://www.SQLStudio.com
> If the dates from the union are equal, the name does not have to be
> and I want to use a specific name.
You are right, sorry for my confusion.
AMB
This question makes no sense. The poorly named derived table,
Mindate, acts as if it is materialized and you no longer have access
to tables B and C. It is like asking to see the eggs after the cake
has been baked.