Ошибка при выполнении запроса в SQL server

#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 записи…

РЕКОМЕНДАЦИЯ: Как правило, при написании таких длинных и сложных запросов рекомендуется выполнять подзапросы или часть выбранных «команд» по одному и контролировать результаты. Если вы сделаете это, вы сможете написать более точный запрос.