MS SQL (SAP B1) «В списке выбора может быть указано только одно выражение, если подзапрос не введен с помощью EXISTS …»

#sql #sql-server #sapb1

#sql #sql-server #sapb1

Вопрос:

Я использовал этот SQL-запрос для базы данных SAP B1, который должен выполнять разные запросы, в зависимости от группы пользователя:

     SELECT CASE
           WHEN T0.GroupId = '2'
           THEN
(
    SELECT T0.Substitute, 
           T0.ItemCode, 
           T1.ItemName
    FROM OSCN T0
         INNER JOIN OITM T1 ON T0.ItemCode = T1.ItemCode
    WHERE T0.CardCode = 'CV-1234'
)
           ELSE(CASE
                    WHEN(T0.GroupId = '4')
                    THEN
(
    SELECT T0.ItemCode
    FROM OSCN T0
    WHERE T0.CardCode = 'CV-1234'
)
                    ELSE ''
                END)
       END
FROM OUGR T0
     INNER JOIN USR7 T1 ON T1.UserId = T1.UserId
WHERE T1.UserId = 'George'
  

Но когда я его запускаю, я получаю сообщение об ошибке «В списке выбора может быть указано только одно выражение, когда подзапрос не вводится с помощью EXISTS».

Ценю любую помощь. Заранее спасибо.

Комментарии:

1. Упрощенный select case when 1=2 then 'a' else (select 1,2) end вариант Вы просто не можете использовать такой ВАРИАНТ. Можете ли вы объяснить с помощью примеров данных и ожидаемых результатов, чего вы пытаетесь достичь?

2. Я использовал этот запрос для форматированного поиска в SAP B1 (вызов службы): в поле ItemCode поля, когда пользователь вводит код элемента и нажимает Tab, запрос должен отображать список результатов, зависит от группы пользователя: — Группа 2: замена (код BP), ItemCode,ItemName — Группа 4: ItemCode, ItemName .

Ответ №1:

вы не можете написать SQL таким образом. Если вы рассматриваете очень простой шаблон SQL:

 SELECT a, b
FROM table1
WHERE x = y;
  

a и b могут быть только отдельными значениями; если вы подумаете об этом, то наличие ‘a’ соответствует нескольким значениям (под которыми я подразумеваю несколько столбцов) не имеет смысла. Не существует такого понятия, как динамический SQL, в котором структура инструкции SQL (или структура ее результата) не определена в момент выполнения или может меняться от строки к строке (вы можете динамически создавать инструкцию SQL, но она фиксирована в момент ее выполнения).

Таким образом, вы можете заменить ‘a’ на любой сложный SQL, какой вам нравится, но этот SQL всегда должен приводить к одному значению.

Не знаю, поддерживается ли оно в вашей среде SAPB1, но обычным способом решения чего-то подобного было бы обернуть его в код (PL / SQL в Oracle, T-SQL в SQL Server и т. Д.) — Таким образом, ваш код определяет, какой из операторов SQL в вашем операторе CASE выполнить, а какой нет.затем просто выполняет этот оператор 1