Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Помогите с заспросом объеденить таблицы  [new]
Anddros
Member

Откуда:
Сообщений: 1077
glyzin
только вот если делать через min (case....
то результат ни тот маленько там вместо категорий цифры, а надо сами категории.

substring(min(case kategoriya when 'kategoriya1' then '1' when 'kategoriya2' then '2' when ... end+kategoriya),2,8000)
Или действительно обратный case, как предложил Glory
19 авг 09, 16:58    [7557827]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
iljy
Member

Откуда:
Сообщений: 8711
glyzin

да есть на самом деле ни одна таблица а две
таблица товаров и таблица категорий которая связан с таблицой товаров по ID

т.е. например

таблица товаров
ID Название товара
1 Товар1
....
2 Товар2
3 Товар3

таблица категорий
ID Название категории
1 Категория1
1 Категория2
...
3 Категория2
3 Категория3

? не понял... В таблице товаров ID - это что? ID товара или ID категории? Честно говоря пока ваша структура осталась загадкой. А заодно - уточните таки, как вы определяете приоритет категорий.
19 авг 09, 17:11    [7557918]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
glyzin
кто сказал что *AX дожна быть а не BOSH для товара2? может наооборот?
Это не Вы у меня, это я у Вас должен спрашивать
Вы так до сих пор и не сказали - что это за приоритет такой и откуда серверу его взять
Так что пока я считаю, что для товара2 дожна быть *AX а не BOSH просто потому, что код символа "*" меньше чем код символа "B"
19 авг 09, 17:15    [7557942]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
glyzin
Member

Откуда:
Сообщений: 258
ID - это ID Товара
и там и там

на счет приоритета я сразу сказал
известно категория1 категория2 .... категорияN
первая и есть самая приоритетная самый меньший приоритет у категорииN последней

чего не понятно?
20 авг 09, 09:55    [7559741]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
glyzin
Member

Откуда:
Сообщений: 258
Anddros
glyzin
только вот если делать через min (case....
то результат ни тот маленько там вместо категорий цифры, а надо сами категории.

substring(min(case kategoriya when 'kategoriya1' then '1' when 'kategoriya2' then '2' when ... end+kategoriya),2,8000)
Или действительно обратный case, как предложил Glory


обратный case можно, только мне кажеться криво как то это все (туда сюда приобразовывать) или я ошибаюсь, а есть другие способы?
20 авг 09, 09:59    [7559756]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
glyzin
чего не понятно?
Паганель
что это за приоритет такой и откуда серверу его взять

Вы вот знаете, что
glyzin
известно категория1 категория2 .... категорияN
первая и есть самая приоритетная самый меньший приоритет у категорииN последней
А откуда об этом узнает сервер?

Имхо необходима таблица категорий, в которой каким-нибудь образом хранился бы приоритет
Иначе Вам не избежать case-ов
(и переписываний запроса при появлении новых категорий, что имхо же еще хуже)
20 авг 09, 10:04    [7559781]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Да, чуть не забыл
glyzin
таблица категорий
ID Название категории
1 Категория1
1 Категория2
...
3 Категория2
3 Категория3
Это не таблица категорий, несмотря на то, что Вы ее так назвали
Это некая таблица связывающая товары и категории, потому что
glyzin
ID - это ID Товара
и там и там
20 авг 09, 10:07    [7559809]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
glyzin
Member

Откуда:
Сообщений: 258
Паганель
glyzin
чего не понятно?
Паганель
что это за приоритет такой и откуда серверу его взять

Вы вот знаете, что
glyzin
известно категория1 категория2 .... категорияN
первая и есть самая приоритетная самый меньший приоритет у категорииN последней
А откуда об этом узнает сервер?

Имхо необходима таблица категорий, в которой каким-нибудь образом хранился бы приоритет
Иначе Вам не избежать case-ов
(и переписываний запроса при появлении новых категорий, что имхо же еще хуже)


ну хорошо пусть будет таблица из одного столбца и N строк (N=9 в реале но может меняться)
первая строка и есть категория с приоритетом 1 ,т.е. номер строки и есть приоритет
тогда как избежать case?

в реале мне ищвестен список категорий располоден в порядке убывания приоритетов
с этого списка я смогу сделать таблицу а дальше что?

сейчас с этого списка формируется строка case.
20 авг 09, 10:09    [7559819]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
glyzin
Member

Откуда:
Сообщений: 258
Паганель,

хорошо раскрую все краты

есть таблица товаров
IDTOVAR NAMETOVAR

есть таблица категорий
IDCAT NAMECAT

есть таблица соотвествий
IDTOVAR IDCAT

но можно проще объеденить joinом таблицы и получить как я писал выше
NAMETOVAR NAMCAT
это для того писал чтоб проще объеснять.
20 авг 09, 10:11    [7559836]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
Anddros
Member

Откуда:
Сообщений: 1077
glyzin
ну хорошо пусть будет таблица из одного столбца и N строк (N=9 в реале но может меняться)
первая строка и есть категория с приоритетом 1 ,т.е. номер строки и есть приоритет
тогда как избежать case?

У таблиц в MsSQL нет НОМЕРОВ строк. :)
20 авг 09, 10:13    [7559842]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
glyzin
Member

Откуда:
Сообщений: 258
+ к этому
есть список категорий который расположен в определнном порядке, размер списка небольшой 10 строк максимум, пусть это будет таблица или список значений, главное
что они есть и определены зарание.
20 авг 09, 10:14    [7559850]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
glyzin
Member

Откуда:
Сообщений: 258
Anddros,

хорошо добавим приоритет колонку.
20 авг 09, 10:15    [7559859]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
glyzin
Member

Откуда:
Сообщений: 258
я заранее могу сформировать sql скрипт программно, потом его выполнить, поэтому пробегаюсь по списку и формирую строку min(case....
20 авг 09, 10:19    [7559884]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
glyzin
Member

Откуда:
Сообщений: 258
есть еще способы обойти case?
20 авг 09, 10:19    [7559891]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
Anddros
Member

Откуда:
Сообщений: 1077
Например, вот так:
select top 1 with ties NAMETOVAR, NAMCAT
from T_TOVARCAT tc
inner join T_CAT c on tc.IDCAT=c.IDCAT 
inner join T_TOVAR t on tc.IDTOVAR=t.IDTOVAR
order by row_number()over(partition by tc.IDTOVAR order by c.PRIORITER) 

Вот теперь вам вполне могут накидать десяток способов решения. :)
20 авг 09, 10:22    [7559909]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
glyzin
Member

Откуда:
Сообщений: 258
Anddros
Например, вот так:
select top 1 with ties NAMETOVAR, NAMCAT
from T_TOVARCAT tc
inner join T_CAT c on tc.IDCAT=c.IDCAT 
inner join T_TOVAR t on tc.IDTOVAR=t.IDTOVAR
order by row_number()over(partition by tc.IDTOVAR order by c.PRIORITER) 

Вот теперь вам вполне могут накидать десяток способов решения. :)


а есче 9? :-)
20 авг 09, 10:29    [7559954]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
glyzin
добавим приоритет колонку.
будет ли она уникальной?
20 авг 09, 10:29    [7559958]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
iljy
Member

Откуда:
Сообщений: 8711
glyzin
Паганель,

хорошо раскрую все краты

есть таблица товаров
IDTOVAR NAMETOVAR

есть таблица категорий
IDCAT NAMECAT

есть таблица соотвествий
IDTOVAR IDCAT


давно бы так. Еще добавим в таблицу категорий колонку "приоритет" Priority и получим
select NAMETOVAR, NAMECAT
from Tovar t
  outer apply
( select top 1 NAMECAT
  from LINK_TAB l join CAT_TAB c on l.IDCAT = c.IDCAT
  where IDTOVAT = t.IDTOVAR
  order by Priority
) t1
20 авг 09, 10:34    [7560004]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
glyzin
Member

Откуда:
Сообщений: 258
Паганель
glyzin
добавим приоритет колонку.
будет ли она уникальной?

Если добавить колонку к уже имеющейся таблице категорий то скорей всего нет. так как приоритет задается только для списка категорий. и все не вошедшии категории в список будет без приоритета.
Если выносить отдельно фильтр по категориям в отдельную таблицу,то будет уникален, потомучто несколько категорий с одним и тем же приоритетом не может быть.
20 авг 09, 10:39    [7560041]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
glyzin
несколько категорий с одним и тем же приоритетом не может быть.
select t.NAMETOVAR, c.NAMECAT
  from (select s.IDTOVAR, min(c.PRIORITY) PRIORITY
          from [таблица соотвествий] s
          join [таблица категорий] c on c.IDCAT = s.IDCAT
         group by s.IDTOVAR
        ) m
  join [таблица товаров] t on t.IDTOVAR = m.IDTOVAR
  join [таблица категорий] c on c.PRIORITY = m.PRIORITY
вот такое вот издевательство над нормальными формами
20 авг 09, 10:42    [7560062]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
Anddros
Member

Откуда:
Сообщений: 1077
glyzin
Anddros
Например, вот так:
select top 1 with ties NAMETOVAR, NAMCAT
from T_TOVARCAT tc
inner join T_CAT c on tc.IDCAT=c.IDCAT 
inner join T_TOVAR t on tc.IDTOVAR=t.IDTOVAR
order by row_number()over(partition by tc.IDTOVAR order by c.PRIORITER) 

Вот теперь вам вполне могут накидать десяток способов решения. :)


а есче 9? :-)

есче 9 чаво?
20 авг 09, 10:43    [7560069]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
glyzin
Member

Откуда:
Сообщений: 258
iljy
glyzin
Паганель,

хорошо раскрую все краты

есть таблица товаров
IDTOVAR NAMETOVAR

есть таблица категорий
IDCAT NAMECAT

есть таблица соотвествий
IDTOVAR IDCAT


давно бы так. Еще добавим в таблицу категорий колонку "приоритет" Priority и получим
select NAMETOVAR, NAMECAT
from Tovar t
  outer apply
( select top 1 NAMECAT
  from LINK_TAB l join CAT_TAB c on l.IDCAT = c.IDCAT
  where IDTOVAT = t.IDTOVAR
  order by Priority
) t1


все бы ничего но колонку приоритет добавлять не целесообразно :-(
потомучто приоритет может меняться это раз и во вторых его надо будет каждый раз перезаписывать, а использоваться это будет только для одного отчета.
20 авг 09, 10:43    [7560080]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
glyzin
Member

Откуда:
Сообщений: 258
Anddros,

Вот теперь вам вполне могут накидать десяток способов решения. :)
20 авг 09, 10:44    [7560091]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
glyzin
потомучто приоритет может меняться это раз и во вторых его надо будет каждый раз перезаписывать, а использоваться это будет только для одного отчета.
Так сделайте таблицу, содержащую приоритеты, временной, создавайте и заполняйте перед выполнением этого отчета,
или вообще в той хранимке где этот запрос табличную переменную объявите, заполните и используйте в запросе
В общем, Вам - полная свобода действий (в рамках возможностей сервера, разумеется:)
20 авг 09, 10:48    [7560111]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с заспросом объеденить таблицы  [new]
Anddros
Member

Откуда:
Сообщений: 1077
glyzin
Anddros,

Вот теперь вам вполне могут накидать десяток способов решения. :)


Еще не вечер. 3 способа уже есть. Если сегодня не доберется до десятка, я так уж и быть - завтра дополню... :)
20 авг 09, 10:51    [7560136]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить