Запрос для элемента с подмножеством связанных элементов
У меня есть две таблицы:
Part (Table) ---- PartID SerialNumber CreationDate Test (Table) ---- PartID TestName TestDateTime TestResult
Таблицы имеют отношение «один-много» к PartID
, одна часть может иметь множество записей Test
.
То, что я пытаюсь сделать, это вернуть список частей с информацией только о последнем тесте, выполненном в этой части.
- Динамическое имя столбца со значением в запросе sql
- Как получить результат оператора select, сгруппированного по столбцу, для выполнения инструкции объединения на нем?
- toggle sql column с нулевым значением JOIN
- Получить все строки из таблицы A, где не существует соответствующей строки в таблице B
- Противоположный внутренний запрос
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
Есть ли другой подход, который я могу взять, чтобы получить данные, которые я ищу?
- SQL Server: идентификатор родителя с наименьшим количеством детей
- Как это сделать в SQL? Мне нужно найти возможные перестановки небольшой таблицы данных
- Объединение нескольких раз в одной таблице для разных критериев по сравнению с однократно на агрегированной таблице
- Тупик, вызванный операцией SELECT JOIN с SQL Server
- Не удалось получить ожидаемый запрос с помощью SQL Server
- Справка по UPDATE с пользовательским INNER JOIN - T-SQL
- mssql select с соединением подзапроса union и как очень медленно
- Как преобразовать это вложенное объединение Informix в вложенное соединение tsql?
Вот еще один способ сделать это, только один раз попадает в тестовую таблицу.
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 записи, если два теста были выполнены в одну и ту же дату. Если включено время, хотя маловероятно, что две точные даты будут соответствовать двум различным тестам для одной части.