Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Case в условии  [new]
Арта
Member

Откуда:
Сообщений: 9
В динамическом условии заранее неизвестно, переданный параметр это конечная запись или это id папки содержащей записи.

select top 10 * from dh6091 as Doc
where Doc.sp6092 in (
  case (select isfolder from sc33 where id = '   2UN   ')
  when 0 then ('   2UN   ')
  else (select id from sc33_tree('   2UN   '))
end)

sc33_tree – функция, возвращающая таблицу записей.

На такой вариант ругается: "Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression."

Куда копать?
28 окт 09, 01:40    [7847260]     Ответить | Цитировать Сообщить модератору
 Re: Case в условии  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36799
Через or писать надо, а не через case.
28 окт 09, 01:59    [7847274]     Ответить | Цитировать Сообщить модератору
 Re: Case в условии  [new]
Арта
Member

Откуда:
Сообщений: 9
OR в любом случае заставит выполнятся функцию :(
28 окт 09, 02:03    [7847278]     Ответить | Цитировать Сообщить модератору
 Re: Case в условии  [new]
Егоров Александр
Member

Откуда: Хабаровск
Сообщений: 517
Арта,

1С:Торговля? ;)
Проще переписать функцию sc33_tree чтобы отрезать лишние условия. Мой аналог:
CREATE FUNCTION GetAllChilds_SC33 (@Goods char(9))  
RETURNS @Result table ([ID] char(9)) AS  
BEGIN 
  declare @T table ([ID] char(9) primary key, ISFOLDER tinyint)
  if not exists(select [ID] from SC33 where [ID]=@Goods and ISFOLDER=1)
    insert into @T values (@Goods, 2)
  else begin
    declare @Cnt int
    insert into @T values (@Goods, 1)
    set @Cnt=1
    while @cnt<>0 begin
      insert into @T 
        select [ID], [ISFOLDER] 
        from SC33 
        where 
          ISFOLDER=1 
          and (PARENTID in (select [ID] from @T)
          and [ID] not in (select [ID] from @T))
      set @Cnt=@@rowcount
    end
    insert into @T 
      select [ID], 2 from SC33 where [ISFOLDER]=2 and [PARENTID] in (select [ID] from @T)
  end
  insert into @Result
    select [ID] from @T where ISFOLDER=2 // Группы исключаем из результата
  return
END
соотв. в запросах не надо будет морочиться группа ли это, или элемент номенклатуры и запрос упрощается в
select top 10 * from dh6091 as Doc
where Doc.sp6092 in (select id from sc33_tree('   2UN   '))
28 окт 09, 03:44    [7847314]     Ответить | Цитировать Сообщить модератору
 Re: Case в условии  [new]
Влом регистрироваться
Guest
Арта,

TOP 1 добавляйте в подзапросах.
28 окт 09, 09:43    [7847669]     Ответить | Цитировать Сообщить модератору
 Re: Case в условии  [new]
Арта
Member

Откуда:
Сообщений: 9
Влом регистрироваться
Арта,

TOP 1 добавляйте в подзапросах.

Там стоит IN, какой TOP 1...
28 окт 09, 21:05    [7852534]     Ответить | Цитировать Сообщить модератору
 Re: Case в условии  [new]
Арта
Member

Откуда:
Сообщений: 9
Егоров Александр
Арта,

1С:Торговля? ;)
Проще переписать функцию sc33_tree чтобы отрезать лишние условия. Мой аналог:


Она самая. Наверное так и придется засунуть все в функцию... Спасиб :)
28 окт 09, 21:09    [7852544]     Ответить | Цитировать Сообщить модератору
 Re: Case в условии  [new]
Влом регистрироваться
Guest
Арта,

сообщение об ошибке перечитайте. И синтаксис CASE рекомендую освежить.
29 окт 09, 08:48    [7853361]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить