J'ai quelques tables qui sont utilisées pour consigner l'activité de l'utilisateur pour une application. Les tableaux ressemble à ceci (code pseudo de la mémoire, ne peut pas être syntaxiquement correcte):SQL Server - mise à jour d'une table avec les première et dernière lignes d'une autre table
create table activity (
sessionid uniqueidentifier not null,
created smalldatetime not null default getutcdate()
);
create table activity_details (
sessionid uniqueidentifier not null,
activity_description varchar(100) not null,
created smalldatetime not null default getutcdate()
);
Mon but est de remplir un tableau récapitulatif pour les rapports qui ressemble à ceci:
create table activity_summary (
sessionid uniqueidentifier not null,
first_activity_desc varchar(100) not null,
last_activity_desc varchar(100) not null
);
Les descriptions des premières et dernières activités seraient déterminées chronologiquement. Ma première pensée est de mettre à jour le tableau de synthèse comme ceci:
truncate table activity_summary;
insert into activity_summary (sessionid)
select sessionid from activity;
update table activity_summary set
first_activity_desc = (select top 1 activity_desc from activity_detail where sessionid = as.sessionid order by created asc),
last_activity_summary = (select top 1 activity_desc from activity_detail where sessionid = as.sessionid order by created desc)
from activity_summary as;
Cependant, cela me semble incroyablement bavard et inutile. Je ne suis pas sûr de savoir comment le réduire. Mon instinct est que je pourrais le faire d'une manière ou d'une autre dans la phrase d'insertion, mais je suis perplexe. Aucune suggestion?
Merci. Je ne sais pas pourquoi je n'ai pas pensé à ça - je devine que je déteste juste encapsuler des instructions select comme des valeurs de colonnes comme ça aussi.Dans les deux cas, le nombre de lectures potentielles générées par la requête est énorme - c'est ce que je cherche à réduire. – Chris
Je vais en faire un sans les requêtes imbriquées pour vous. –