Какой запрос SQL или код LINQ будет получать следующие данные? - PullRequest
1 голос
/ 27 марта 2009

Во-первых, вот изображение соответствующей части моей схемы базы данных:

Схема базы данных http://ewal.net/stuff/schema.png

У меня есть несколько концептуальных запросов возрастающей сложности. В настоящее время я делаю это с помощью серии SQL-запросов (т. Е. Много поездок туда и обратно из кода C # на SQL Server), и я хотел бы найти способ получить их каждый в одном запросе, но это немного выходит за рамки моих личных возможностей TSQL / LINQ. Вот вопросы, которые я пытаюсь выяснить, как написать:

  1. Запрос на возврат самой последней записи рабочего плана для каждого пользователя (не для конкретного пользователя - для всех пользователей).
  2. Запрос на возврат самого последнего рабочего плана для каждого из указанного набора пользователей (т. Е. У меня есть список идентификаторов пользователей на клиенте (т. Е. В массиве)
  3. Запрос для извлечения всех «текущих» записей проекта для каждого из указанного набора пользователей. «Текущий» означает, что запись рабочего плана, к которой прикреплен проект, является самой последней записью рабочего плана для связанного пользователя.

Для справки, я использую SQL Server 2005 и LINQ to SQL в C # и был бы рад найти решение на основе хранимой процедуры или прямой код LINQ, который выполняет каждый запрос.

1 Ответ

3 голосов
/ 27 марта 2009

Самый последний план работы для всех пользователей:

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

Для данного набора пользователей напишите табличную функцию, которая превращает разделенный список идентификаторов в таблицу этих идентификаторов. Если вы будете искать вокруг, я знаю, что я разместил этот код здесь раньше. Тогда вы можете использовать:

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

Для заданного набора пользователей верните все их текущие проекты:

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

Конечно, вы должны перечислить имена столбцов вместо использования "*".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...