Hello,
Cela a très certainement déjà été demandé à de nombreuses reprises mais je ne parviens pas à mettre la main dessus.
Considérons, par exemple, la table d'addresses suivantes (example simplifié pour focaliser le besoin):
Le besoin est de récupérer l'adresse actuelle ou la dernière valable.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 CREATE TABLE T_ADDRESS_ADR ( ADR_ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, CLI_ID INT NOT NULL REFERENCES T_CLIENT_CLI.CLI_ID, ADR_START_DATE DATETIME2 NOT NULL, ADR_END_DATE DATETIME2 NOT NULL DEFAULT '99991231', ADR_LINE1 VARCHAR(500), ADR_LINE2 VARCHAR(500), ADR_LINE3 VARCHAR(500) )
Actuellement, j'y parviens à base de CTE et de la fonction de fenêtrage ROW_NUMBER.
Cela donne quelque chose dans ce genre-ci :
Cela fonctionne mais n'y aurait-il pas mieux ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 WITH ADR_TMP AS ( SELECT ADR_ID, CLI_ID, ADR_START_DATE, ADR_END_DATE, ADR_LINE1, ADR_LINE2, ADR_LINE3, ROW_NUMBER() OVER(PARTITION BY CLI_ID ORDER BY ADR_END_DATE DESC, ADR_START_DATE DESC) AS 'RN' FROM T_ADDRESS_ADR ), ADR AS ( SELECT ADR_ID, CLI_ID, ADR_START_DATE, ADR_END_DATE, ADR_LINE1, ADR_LINE2, ADR_LINE3 FROM T_ADDRESS_ADR WHERE GETDATE() BETWEEN ADR_START_DATE AND ADR_END_DATE UNION SELECT T.ADR_ID, T.CLI_ID, T.ADR_START_DATE, T.ADR_END_DATE, T.ADR_LINE1, T.ADR_LINE2, T.ADR_LINE3 FROM T_ADDRESS_ADR T INNER JOIN ADR_TMP V ON T.ADR_ID = V.ADR_ID WHERE V.RN = 1 ) SELECT * FROM ADR WHERE CLI_ID = XXX
Merci d'avance.








Répondre avec citation









Partager