Tenho duas tabelas assim:
T1_Key, T1_Data, T1_ValidUntil
1 A 2000-01-01
1 B 2000-06-30
2 C 2005-05-31
3 D 2004-12-31
3 E 2007-04-30
3 F 2008-01-31
T2_Key, T2_Data, T2_ValidUntil
1 R 2002-03-31
2 S 2001-06-30
2 T 2003-02-28
2 U 2005-05-31
3 V 2006-09-30
3 W 2007-06-30
Isso define um número de intervalos em que dados específicos são válidos. Por exemplo, para chave 2 e data 2002-01-01, as entradas (2, C, 2005-05-31) e (2, T, 2003-02-28) são válidas (ou seja, as entradas com a próxima data maior ). Para chave 2 e data 2010-01-01 nenhuma entrada é válida.
Para uma única consulta como acima, apenas consulto ambas as tabelas separadamente e uno os dados em meu aplicativo. No entanto, para um aplicativo de manutenção, gostaria de unir essas duas tabelas. O resultado deve conter todos os intervalos/combinações válidos , assim (a Chave 3 é a mais complexa, pois não há datas compartilhadas):
T1_Key, T1_Data, T1_ValidUntil, T2_Key, T2_Data, T2_ValidUntil
1 A 2000-01-01 1 R 2002-03-31
1 B 2000-06-30 1 R 2002-03-31
2 C 2005-05-31 2 S 2001-06-30
2 C 2005-05-31 2 T 2003-02-28
2 C 2005-05-31 2 U 2005-05-31
3 D 2004-12-31 3 V 2006-09-30 <- I1
3 E 2007-04-30 3 V 2006-09-30 <- I2
3 E 2007-04-30 3 W 2007-06-30 <- I3
3 F 2008-01-31 3 W 2007-06-30 <- I4
ASCII-Art vor Case 3 (Timelines):
2004-12-31 2007-04-30 2008-01-31
T1 -----|-----------------|-----------------------|----------
I1 I2 I3 I4 Nothing valid here
T2 ---------------|-----------------|--------------------------
2006-09-30 2007-06-30
Atualmente eu simplesmente entro usando as teclas, mas isso dá muitas combinações que não são válidas. Portanto, preciso de uma maneira de dizer "Junte isso à entrada com a próxima data mais alta (ou igual) na outra tabela" e uma maneira de fazer isso em ambas as direções ...
O esquema é predefinido e não posso alterá-lo muito. Uma terceira tabela muitos-para-muitos parece dados redundantes para mim.
Desde já, obrigado!
1 respostas