Как работать после "Этот подзапрос может вернуть не более одной записи" - PullRequest
0 голосов
/ 18 июня 2020

Мне сложно понять эту ошибку в ходе всех исследований, которые я провел. У меня есть следующий запрос

SELECT M.[PO Concatenate], Sum(M.SumofAward) AS TotalAward, (SELECT TOP 1 M1.[Material Group] FROM 
[MGETCpreMG] AS M1 WHERE M1.[PO Concatenate]=M.[PO Concatenate] ORDER BY M1.SumofAward DESC) AS TopGroup
FROM MGETCpreMG AS M
GROUP BY M.[PO Concatenate];

Для краткого примера он просматривает результаты, которые я хочу, но затем появляется ошибка «Не более одной записи может быть возвращена этим подзапросом» и стирает все данные в #Name ?

Для контекста, [MGETCpreMG] - это запрос из основной таблицы [MG ETC], который использовался для консолидации Award для различных групп материалов в транзакции PO ([PO Concatenate])

SELECT [MG ETC].[PO Concatenate], Sum([MG ETC].Award) AS SumOfAward, [MG ETC].[Material Group]
FROM [MG ETC]
GROUP BY [MG ETC].[PO Concatenate], [MG ETC].[Material Group]
ORDER BY [MG ETC].[PO Concatenate];

Я думаю, это кроется в моей неспособности понять, как использовать подзапрос.

1 Ответ

0 голосов
/ 19 июня 2020

В случае, когда запрос может возвращать более одного значения? Просто добавьте дополнительную сортировку по.

Итак, общий подзапрос может заключаться в получении последнего счета. Таким образом, у вас может быть:

select ID, CompanyName,
  (SELECT TOP 1 InvoiceDate from tblInvoice 
   where tblInvoice.CustomerID = tblCompany.ID
   Order by InvoiceDate DESC)
  As LastInvoiceDate
From tblCustomers

Теперь вышеуказанное может работать в течение некоторого времени, но затем оно взорвется, поскольку у вас может быть два счета за один и тот же день!

Итак, все вы необходимо добавить это дополнительное предложение order by - скажем, на PK дочерней таблицы, например:

   Order by InvoiceDate DESC,ID DESC)

Таким образом, верхний 1 будет учитывать добавленные вами «дополнительные» столбцы порядка и, следовательно, только когда-либо возвращать одна строка - даже если есть несколько значений, которые соответствуют верхнему столбцу 1.

Я полагаю, что в приведенном выше примере мы могли бы забыть invoiceDate и всегда брать самый верхний последний идентификатор автонумерации, но для многих запросов вы не всегда можете быть уверены - возможно, нам нужна последняя самая дорогая сумма счета. И снова, если максимальное значение (вверху) было одинаковым для двух больших сумм счета, тогда снова могут быть возвращены две строки. Итак, просто добавьте дополнительное предложение ORDER BY со вторым столбцом, который упорядочивает данные. Таким образом, верхняя 1 будет вытягивать только первое значение. Ваш пример верхней группы является таким примером. Просто добавьте дополнительный заказ по «ID» или какому-либо другому столбцу идентификатора автоматического номера.

...