1 votes

Quelle requête SQL ou quel code LINQ permettrait d'obtenir les données suivantes ?

Tout d'abord, voici une image de la partie concernée de mon schéma de base de données :

Database Schema

J'ai plusieurs requêtes conceptuelles de complexité croissante. Actuellement, je les réalise à l'aide d'une série de requêtes SQL (c'est-à-dire de nombreux allers-retours entre le code C# et le serveur SQL), et j'aimerais trouver un moyen de les obtenir toutes en une seule requête, mais cela dépasse un peu mes compétences personnelles en TSQL/LINQ. Voici les requêtes que j'essaie de trouver comment écrire :

  1. Une requête pour retourner l'enregistrement le plus récent du plan de travail pour chaque utilisateur (pas pour un utilisateur particulier - pour tous les utilisateurs).
  2. Une requête pour retourner le plan de travail le plus récent pour chacun d'un ensemble spécifié d'utilisateurs (c'est-à-dire que j'ai une liste d'identifiants d'utilisateurs sur le client (c'est-à-dire dans un tableau).
  3. Une requête pour récupérer tous les enregistrements de projet "actuels" pour chacun d'un ensemble spécifié d'utilisateurs. "Actuel" signifie que l'enregistrement du plan de travail auquel le projet est rattaché est l'enregistrement du plan de travail le plus récent pour l'utilisateur associé.

À titre de référence, j'utilise SQL Server 2005 et LINQ to SQL en C# et je serais heureux de trouver une solution basée sur une procédure stockée ou un code LINQ direct permettant de réaliser chaque requête.

3voto

Tom H. Points 23783

Le plan de travail le plus récent pour tous les utilisateurs :

SELECT
     WP1.*
FROM
     Workplans WP1
LEFT OUTER JOIN dbo.Workplans WP2 ON
     WP2.UserID = WP1.UserID AND
     WP2.Date > WP1.Date
WHERE
     WP2.WorkplanID IS NULL

Pour un ensemble donné d'utilisateurs, écrivez une fonction à valeur de tableau qui transforme une liste délimitée d'identifiants en un tableau de ces identifiants. Si vous cherchez, je sais que j'ai déjà posté ce code ici. Vous pouvez alors l'utiliser :

SELECT
     WP1.*
FROM
     dbo.GetTableFromIDList(@id_list) U
INNER JOIN Workplans WP1 ON
     WP1.UserID = U.ID
LEFT OUTER JOIN dbo.Workplans WP2 ON
     WP2.UserID = WP1.UserID AND
     WP2.Date > WP1.Date
WHERE
     WP2.WorkplanID IS NULL

Pour un ensemble donné d'utilisateurs, renvoyer tous leurs projets en cours :

SELECT
     P.*
FROM
     dbo.GetTableFromIDList(@id_list) U
INNER JOIN Workplans WP1 ON
     WP1.UserID = U.ID
LEFT OUTER JOIN dbo.Workplans WP2 ON
     WP2.UserID = WP1.UserID AND
     WP2.Date > WP1.Date
INNER JOIN dbo.Projects P ON
     P.WorkplanID = WP1.WorkplanID
WHERE
     WP2.WorkplanID IS NULL

Bien sûr, vous devez énumérer les noms des colonnes au lieu d'utiliser "*".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X