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

Откуда:
Сообщений: 136
Здравствуйте все!

Помогите с запросом пожалуйста.
Есть таблицs
Заявки (zayav) a
idosn
name
.....
kodzayav (принимает значение 1, 2, 3)

Доступ (dost) b
id
idosn-связь с заявками
resurs
...
ТО-заявки (TO) c
id
idosn-связь с заявками
nomformul
...
Связь (CV) d
id
idosn-связь с заявками
nomtel
...

необходимо сделать выборку: все поля из zayav, и в зависимости от того какое значение принимает kodzayav выводить поля из других таблиц, т.е. если kodzayav=1, то resurs из dost, если kodzayav=2, то nomformul из ТО, если kodzayav=3, то nomtel из CV.
Возможно ли это реализовать?
26 янв 06, 08:11    [2288494]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
CASE Вам поможет...
26 янв 06, 08:26    [2288515]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Timon
Member

Откуда: Dushanbe TJK
Сообщений: 2688
Можно использовать CASE

select zayav.*, 
case zayav.kodzayav 
when 1 then dost. resurs
when 2 then  ТО.nomformul
when 3 then CV.nomtel
else 'Unknown' end as FFFF
from zayav
inner join dost on dost.idosn = zayav.idosn
inner join TO on TO.idosn = zayav.idosn
inner join CV on  CV.idosn = zayav.idosn
так например.
26 янв 06, 08:26    [2288517]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Plux
Member

Откуда:
Сообщений: 136
Я понимаю что надо использовать case, но у меня что-то не получается. Пишу так:

select idGlav,idosn,kodmestust,.....,
case kodzayav when 1 then (select resurs from dostup e right join Naosnov_Glav a ON e.Idosn = a.Idosn)
 end as kodzayav 
from Naosnov_Glav a 

Пишет: "Подзапрос возвратил больше чем 1 значение. Этому не разрешают, когда подзапрос следует =,! =, <, < =, >, > = или когда подзапрос используется как выражение."

Что я упустила? Подскажите пожалуйста
26 янв 06, 08:48    [2288564]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Timon
Member

Откуда: Dushanbe TJK
Сообщений: 2688
Мдя, вы мой запрос попробовали?

select idGlav,idosn,kodmestust,.....,
case kodzayav when 1 then (select resurs from dostup e right join Naosnov_Glav a ON e.Idosn = a.Idosn) -- select возвращает больше 1-й записи вот и ошибка
end as kodzayav
from Naosnov_Glav a
26 янв 06, 08:50    [2288576]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Plux
Member

Откуда:
Сообщений: 136
Timon, использовала Ваш пример, вроде должен пойти, но он говорит:
"Неоднозначное название(имя) столбца 'IDOsn' ", я не пойму какая ему нужна конкретика, если в inner join прописано условие. Связь между таблицами 1:1.
26 янв 06, 08:58    [2288606]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Timon
Member

Откуда: Dushanbe TJK
Сообщений: 2688
2Plux, Вы сами не переводите сообщения, лучше приводите их в Английском виде.

Возмите TO в квадратные скобки [TO]
26 янв 06, 09:02    [2288617]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Аленочка
Member

Откуда: Владик
Сообщений: 2169
Plux
Я понимаю что надо использовать case, но у меня что-то не получается. Пишу так:

select idGlav,idosn,kodmestust,.....,
case kodzayav when 1 then (select resurs from dostup e right join Naosnov_Glav a ON e.Idosn = a.Idosn)
 end as kodzayav 
from Naosnov_Glav a 

Пишет: "Подзапрос возвратил больше чем 1 значение. Этому не разрешают, когда подзапрос следует =,! =, <, < =, >, > = или когда подзапрос используется как выражение."

Что я упустила? Подскажите пожалуйста


и правильно, ваш подзапрос должен вернуть только одно значение, наверное в подзапросе не хватает какого-либо условия
26 янв 06, 09:03    [2288619]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Аленочка
Member

Откуда: Владик
Сообщений: 2169
а поле resurs есть в обоих таблицах? dostup и Naosnov_Glav ? или только в одной из них?

Картинка с другого сайта. Аленочка тм
26 янв 06, 09:07    [2288626]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Plux
Member

Откуда:
Сообщений: 136
Аленочка
а поле resurs есть в обоих таблицах? dostup и Naosnov_Glav ? или только в одной из них?

Картинка с другого сайта. Аленочка тм


поле resurs есть только в одной таблице, поле сваязи, присудствующая во всех таблицах idosn- является главным ключем таблицы zayav
26 янв 06, 09:59    [2288797]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Plux
Member

Откуда:
Сообщений: 136
Timon
2Plux, Вы сами не переводите сообщения, лучше приводите их в Английском виде.

Возмите TO в квадратные скобки [TO]


На самом деле таблица называется TexZayav, но пока это не имеет значения. Я пока пытаюсь хотя бы с одним вариантом разобраться с таблицей dostup, а потом все по анологии тойдет.
26 янв 06, 10:12    [2288871]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104760
select *
from zayav a
left outer join dost b on a.idosn = b.idosn and a.kodzayav = 1
left outer join [TO] c on a.idosn = c.idosn and a.kodzayav = 2
left outer join CV d on a.idosn = d.idosn and a.kodzayav =3
26 янв 06, 10:24    [2288936]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Plux
Member

Откуда:
Сообщений: 136
Glory
select *
from zayav a
left outer join dost b on a.idosn = b.idosn and a.kodzayav = 1
left outer join [TO] c on a.idosn = c.idosn and a.kodzayav = 2
left outer join CV d on a.idosn = d.idosn and a.kodzayav =3


Спасибо Glory, Ваше уточнение and a.kodzayav = 1 как раз то что нужно было.

Всем огромное спасибо!!!
26 янв 06, 10:35    [2289004]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Plux
Member

Откуда:
Сообщений: 136
еще один вопрос так все работает, а если мне надо вывести не одно поле, а 2 или 3 что делать, он ругается на запятую если я начинаю перечислять нужный поля

select a.idGlav,idosn,kodmestust, .....,
case kodzayav when 1 then [b]e.resurs[/b]
 end as kodzayav 

from Naosnov_Glav a 
left outer join dostup e ON a.Idosn = e.Idosn
26 янв 06, 10:49    [2289095]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Plux
еще один вопрос так все работает, а если мне надо вывести не одно поле, а 2 или 3 что делать, он ругается на запятую если я начинаю перечислять нужный поля

тогда надо написать 2, 3 ... case
26 янв 06, 10:56    [2289135]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Полный запрос привидите.
И полное сообщение об ошибке.
26 янв 06, 10:57    [2289140]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Plux
Member

Откуда:
Сообщений: 136
полный запрос должен получиться что-то вроде этого:

select a.idGlav,idosn,kodmestust, c.komp, zakazchik,dolgn,isnull(tel,'') as tel,
idispolnit,ispolnit,isnull(PredDatZakr,'') as preddatzakr, 
isnull(b.soglasorgan,'') as idsog,datsoglas,isnull(nomisx,'') as nomisx, 
isnull(nomvx,'') as nomvx, d.status,isnull(a.prim,'') as prim, datzakr,

case kodzayav when 1 then f.vidDostup, e.resurs, e.dostupCh
when 2 then g.Nomformul, g.TypeUsva,g.model
when 3 then i.serial,i.nomtel, j.modelap
 
end as kodzayav 

from Naosnov_Glav a 
left join soglas b ON a.IdSoglas = b.IdSoglas 
left join kompany c ON a.Idkom = c.Idkom 
left join status d ON a.Idstat = d.Idstat 
left outer join dostup e ON a.Idglav = e.Idglav and a.idGlav=1
left join VidZayavDostup f ON f.Idvid = e.IdVID
left outer join TexZayav g ON a.Idglav = g.Idglav and a.idGlav=2
left outer join ZayavSvyaz h ON a.Idglav = g.Idglav and a.idGlav=3 and h.kodsvyaz=1
left join Telef i ON i.KodSvyaz = h.KodSvyaz
left join ModelApparat j ON i.Idmodel = j.Idmodel

Ошибка:

Server: Msg 170, Level 15, State 1, Line 6
Line 6: Incorrect syntax near ','.
26 янв 06, 11:14    [2289259]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104760
case может вернуть только одно значение
26 янв 06, 11:15    [2289272]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Plux
Member

Откуда:
Сообщений: 136
А как же тогда быть? может какой другой вариант подскажете?
26 янв 06, 11:18    [2289287]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Plux
А как же тогда быть? может какой другой вариант подскажете?

Писать case столько раз, сколько столбцов вы хотите видеть
26 янв 06, 11:22    [2289313]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Plux
Member

Откуда:
Сообщений: 136
case внутри данного или перечислением?
26 янв 06, 11:28    [2289346]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Plux
case внутри данного или перечислением?

Зависит от того,сколько столбцов вы хотите видеть в результатах
Если 1, то вложенный. Если 3, то перечислением
26 янв 06, 11:30    [2289360]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Plux
Member

Откуда:
Сообщений: 136
Спасибо за разъяснение.
Это конечно издевательство писать столько case-ов, но я попробую.
Еще раз большое спасибо.
26 янв 06, 11:32    [2289372]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Plux
Спасибо за разъяснение.
Это конечно издевательство писать столько case-ов, но я попробую.
Еще раз большое спасибо.

Это результат ошибки вашей модели данных.
Для одной сущности сделаны три разные таблицы.
26 янв 06, 11:37    [2289403]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
Plux
Member

Откуда:
Сообщений: 136
еще один вопрос, надеюсь последний, текст запроса без лишних полей:

select a.idGlav,idosn,kodmestust,  
isnull(nomvx,'') as nomvx, d.status,isnull(a.prim,'') as prim, datzakr,kodzayav,

case kodzayav 
when 1 then 'd'   --e.iddost
--when 2 then g.idtex
--when 3 then i.idsvyaz
end as kodzayav
from Naosnov_Glav a 
left join soglas b ON a.IdSoglas = b.IdSoglas 
left join kompany c ON a.Idkom = c.Idkom 
left join status d ON a.Idstat = d.Idstat 
left join dostup e ON a.Idglav = e.Idglav and a.idGlav=1
left join VidZayavDostup f ON f.Idvid = e.IdVID
left outer join TexZayav g ON a.Idglav = g.Idglav and a.idGlav=2
left outer join ZayavSvyaz h ON a.Idglav = g.Idglav and a.idGlav=3 and h.kodsvyaz=1
left join Telef i ON i.idSvyaz = h.idSvyaz
left join ModelApparat j ON i.Idmodel = j.Idmodel

Если я в when 1 then пишу значение в кавычках, то все замечательно, но если я ставлю e.iddost (всегда имеется, т.к. главный ключ второй таблицы), он выдает Null. В чем проблема? я опять не понимаю.... это очередные приколы case-а?
26 янв 06, 12:11    [2289627]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить