#sql #sql-server
Вопрос:
Когда я запускаю следующий запрос , я получаю это сообщение об ошибке :
Msg 512, Уровень 16, Состояние 1,
Подзапрос строки 2 вернул более 1 значения. Это недопустимо, если подзапрос следует =, !=, <, <= , >, <= , >>= или когда подзапрос используется в качестве выражения.
Не мог бы кто-нибудь, пожалуйста, помочь мне с правильным запросом?
SELECT DISTINCT
TB.[U_Budget_Key] AS [Budget Key],
(SELECT SUM(T01.[U_Budget_XOF])
FROM [dbo].[@BUDGET] T01
WHERE T01.[U_Budget_Key] = TB.[U_Budget_Key]
GROUP BY T01.[U_Budget_Key]) AS [Q8],
(SELECT SUM(T1.[OpenSum])
FROM OPRQ T0
INNER JOIN PRQ1 T1 ON T0.[DocEntry] = T1.[DocEntry]
INNER JOIN OOCR T2 ON T1.OcrCode4 = T2.OcrCode
WHERE T1.[U_Budget] = TB.[U_Budget_Key]
AND T1.[LineTotal] <> 0
AND T1.[U_Budget] <> ''
AND T0.[CANCELED] <> 'Y'
AND T1.[LineStatus] = 'O'
GROUP BY T1.[U_Budget]) AS [Open PR],
(SELECT SUM(T1.[OpenSum])
FROM OPOR T0
INNER JOIN POR1 T1 ON T0.[DocEntry] = T1.[DocEntry]
WHERE T1.[U_Budget] = TB.[U_Budget_Key]
AND T0.[DocStatus] = 'O'
AND T1.[LineTotal] <> 0
AND T1.[U_Budget] <> ' '
GROUP BY T1.[U_Budget]) AS [Open PO],
(SELECT (ISNULL((SELECT SUM(TA.[Debit])
FROM JDT1 TA
WHERE TA.[Account] = T0.[AcctCode]
AND TA.ocrcode4 = T2.[OcrCode]
GROUP BY TA.[Account],
TA.ocrcode4),
0) - ISNULL((SELECT SUM(TB.[Credit])
FROM JDT1 TB
WHERE TB.[Account] = T0.[AcctCode]
AND TB.ocrcode4 = T2.[OcrCode]
GROUP BY TB.[Account],
TB.ocrcode4),
0))
FROM OBGT T0
INNER JOIN BGT1 T1 ON T0.[AbsId] = T1.[BudgId]
INNER JOIN BGT2 T2 ON T0.[AbsId] = T2.[BudgId]
WHERE T2.[OcrCode] = TB.[U_Budget_Key]
AND T2.[Instance] = 2
GROUP BY T2.[OcrCode],
T0.[AcctCode]) AS [Actual]
FROM [@BUDGET] TB;
Комментарии:
1. Не помечайте спам; это были 3 совершенно разных продукта СУБД, которые вы там отметили. При пометке СУБД просто отметьте ту, которую вы действительно используете. Исходя из использования скобок (
[]
) в качестве идентификатора-разделителя, а также кода ошибки и сообщения, соответствующего этому в документации, я предполагаю , что вы используете SQL Server.2. Ошибка также очень конкретно говорит вам о проблеме; как насчет ошибки, которую вы здесь не понимаете?
3. Также требуется чтение: Вредные привычки : Использование псевдонимов таблиц, таких как (a, b, c) или (t1, t2, t3) .
4. Ларну , да, я использую Sql server
5. Точно, запрос возвращает более одного значения. Я хотел бы, пожалуйста, исправить это, чтобы иметь возможность удалить блокировку
Ответ №1:
Эта ошибка возникает только в ситуациях, когда выбранные данные должны быть возвращены одной записью, а не несколькими записями. Например:
-- correct
select * from examples.user_group
where user_id = (select user_id from examples.user_detail where id = 10)
-- incorrect
select * from examples.user_group
where user_id = (select user_id from examples.user_detail where id in (5,10))
-- correct
select *, (select max(user_id) from examples.user_detail) as max_user_id
from examples.user_group
-- incorrect
select *, (select max(user_id) from examples.user_detail group by id, "month") as max_user_id
from examples.user_group
Ваш запрос имеет тот же неправильный синтаксис:
SELECT DISTINCT
-- column 1
TB.[U_Budget_Key] AS [Budget Key],
-- column 2
(SELECT SUM(T01.[U_Budget_XOF])
FROM [dbo].[@BUDGET] T01
WHERE T01.[U_Budget_Key] = TB.[U_Budget_Key]
GROUP BY T01.[U_Budget_Key]) AS [Q8],
-- column 3
(SELECT SUM(T1.[OpenSum])
FROM OPRQ T0
INNER JOIN PRQ1 T1 ON T0.[DocEntry] = T1.[DocEntry]
INNER JOIN OOCR T2 ON T1.OcrCode4 = T2.OcrCode
WHERE T1.[U_Budget] = TB.[U_Budget_Key]
AND T1.[LineTotal] <> 0
AND T1.[U_Budget] <> ''
AND T0.[CANCELED] <> 'Y'
AND T1.[LineStatus] = 'O'
GROUP BY T1.[U_Budget]) AS [Open PR],
-- column 4
(SELECT SUM(T1.[OpenSum])
FROM OPOR T0
INNER JOIN POR1 T1 ON T0.[DocEntry] = T1.[DocEntry]
WHERE T1.[U_Budget] = TB.[U_Budget_Key]
AND T0.[DocStatus] = 'O'
AND T1.[LineTotal] <> 0
AND T1.[U_Budget] <> ' '
GROUP BY T1.[U_Budget]) AS [Open PO],
---- column 5 ----
(SELECT (ISNULL((SELECT SUM(TA.[Debit])
FROM JDT1 TA
WHERE TA.[Account] = T0.[AcctCode]
AND TA.ocrcode4 = T2.[OcrCode]
GROUP BY TA.[Account], TA.ocrcode4),
-------- INCORRECT SYNTAX, in group by you have 2 fields,
-------- therefore this select will be return 2 records, 2 sum(TA.[Debit] values)
0) - ISNULL((SELECT SUM(TB.[Credit])
FROM JDT1 TB
WHERE TB.[Account] = T0.[AcctCode]
AND TB.ocrcode4 = T2.[OcrCode]
GROUP BY TB.[Account], TB.ocrcode4),
-------- same incorrect syntax
0))
FROM OBGT T0
INNER JOIN BGT1 T1 ON T0.[AbsId] = T1.[BudgId]
INNER JOIN BGT2 T2 ON T0.[AbsId] = T2.[BudgId]
WHERE T2.[OcrCode] = TB.[U_Budget_Key]
AND T2.[Instance] = 2
GROUP BY T2.[OcrCode],
T0.[AcctCode]) AS [Actual]
FROM [@BUDGET] TB;
В вашем запросе в столбце 5 значение должно быть указано одно значение, поэтому одна запись, но в этом запросе в столбце 5 будет 2 записи…
РЕКОМЕНДАЦИЯ: Как правило, при написании таких длинных и сложных запросов рекомендуется выполнять подзапросы или часть выбранных «команд» по одному и контролировать результаты. Если вы сделаете это, вы сможете написать более точный запрос.