Запрос для элемента с подмножеством связанных элементов

У меня есть две таблицы:

Part (Table) ---- PartID SerialNumber CreationDate Test (Table) ---- PartID TestName TestDateTime TestResult 

Таблицы имеют отношение «один-много» к PartID , одна часть может иметь множество записей Test .

То, что я пытаюсь сделать, это вернуть список частей с информацией только о последнем тесте, выполненном в этой части.

 Part Test PartID SerialNumber CreationDate PartID TestName TestDateTime TestResult -------------------------------- ------------------------------------------- 1 555 12/9/2013 1 Test 1 1/1/2014 Pass 1 Test 2 2/2/2014 Fail 

Я хотел бы вернуть последние данные теста с информацией о части:

 PartID SerialNumber CreationDate TestName TestDateTime TestResult ----------------------------------------------------------------- 1 555 12/9/2013 Test 2 2/2/2014 Fail 

В настоящее время я могу получить TestDateTime последнего теста части, но никакой другой информации с этим запросом (поскольку подзапрос не может вернуть больше, чем больше):

 SELECT PartID, SerialNumber, CreationDate, (SELECT TOP (1) TestDateTime FROM Test WHERE (PartID = Part.PartID) ORDER BY TestDateTime DESC) AS LastDateTime FROM Part ORDER BY SerialNumber 

Есть ли другой подход, который я могу взять, чтобы получить данные, которые я ищу?

Вот еще один способ сделать это, только один раз попадает в тестовую таблицу.

 with SortedData as ( SELECT PartID , SerialNumber , CreationDate , TestDateTime , ROW_NUMBER() over (Partition by PartID ORDER BY TestDateTime DESC) AS RowNum FROM Part p join Test t on t.PartID = p.PartID ) select PartID , SerialNumber , CreationDate , TestDateTime from SortedData where RowNum = 1 ORDER BY SerialNumber 

Если вы в 2012 году или позже, вы также можете использовать FIRST_VALUE

Попробуйте использовать дополнительный запрос в своем соединении и затем фильтруйте на основе этого. Ваш запрос Sub должен выбрать PardID и Max (TestDateTime)

 Select TestSubQ.PartID, Max(TestSubQ.TestDateTime) From Test TestSubQ group by TestSubQ.PartID 

Затем просто отфильтруйте основной запрос, присоединив эту таблицу

 Select Part.PartID, SerialNumber, CreationDate, TestMain.PartID, TestMain.TestName, TestMain.TestDateTime, TestMain.TestResult From Part Left Outer Join (Select TestSubQ.PartID, Max(TestSubQ.TestDateTime) From Test TestSubQ group by TestSubQ.PartID) TestPartSub On Part.PartID = TestPartSub.PartID Left Outer Join Test TestMain On TestPartSub.PartID = TestMain.PartID And TestPartSub.TestDateTime = TestMain.TestDateTime Order By SerialNumber 

Обратите внимание, что если ваши данные содержат только даты, но не время, вы можете по-прежнему иметь 2 записи, если два теста были выполнены в одну и ту же дату. Если включено время, хотя маловероятно, что две точные даты будут соответствовать двум различным тестам для одной части.

  • Объединение таблиц SQL Server с дубликатами
  • stat report, объединяющий данные из 3 таблиц - объединение или подзапрос
  • Соединение SQL Complex не дает отчетливого результата
  • Таблица. Ошибка производительности в Entity Framework.
  • Использование RTRIM в состоянии JOIN
  • Оптимальный способ поиска последней попытки вызова - база данных CTI
  • SQL Server CTE не присоединяется должным образом
  • Как запросить предварительные этапы на SQL Server?
  • Выбор Distinct Fields From With Rows
  • SQL: вычисление максимальной даты для нескольких таблиц
  • Поворот столбцов в строки для объединенных таблиц
  • Давайте будем гением компьютера.