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

Откуда: Украина
Сообщений: 22
Можно ли такое сделать одним запросом (у меня фантазии хватает сделать это только процедурой)?
Таблица Table1 имеет поля Pokazatel и Priznak.

Table1:
205 4
205 5
208 4
209 4
Таблица Table2 имеет поля Pokazatel, Priznak, Rasshifrovka1, Rasshifrovka2.

Table2:
200 1 null   null
200 2 null null
200 3 null null
205 1 null null
205 2 null null
205 3 null null
205 4 12 null
205 5 12 20
208 1 null null
208 2 null null
208 3 null null
208 4 58 null
(т.е. для каждого Pokazatel'я должны быть записи с Priznak'ами 1,2,3 (обязательно), а также с Priznak'ами, перечисленными в таблице Table1)

Необходимо выполнить проверку, что для входных переменных @Pokazatel, @Rasshifrovka1, @Rasshifrovka2 есть записи в таблице Table2 со значениями
Pokazatel=@Pokazatel и Priznak=1,2,3
а также с Priznak=4 при Rasshifrovka1=@Rasshifrovka1
и Priznak=5 при Rasshifrovka2=@Rasshifrovka2.
Например,
1) @Pokazatel=200, @Rasshifrovka1=0, @Rasshifrovka=0 - Успешно.
2) @Pokazatel=205, @Rasshifrovka1=0, @Rasshifrovka=0 - Успешно.
3) @Pokazatel=205, @Rasshifrovka1=12, @Rasshifrovka=0 - Успешно.
4) @Pokazatel=205, @Rasshifrovka1=12, @Rasshifrovka=20 - Успешно.
5) @Pokazatel=205, @Rasshifrovka1=12, @Rasshifrovka=22 - Ошибка (нет записи 205 5 12 22)
5) @Pokazatel=208, @Rasshifrovka1=13, @Rasshifrovka=0 - Ошибка (нет записи 208 5 13 null)
20 окт 11, 17:33    [11474567]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли такое сделать одним запросом  [new]
iljy
Member

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

declare @t1 table(Pokazatel int, Priznak int)
insert @t1 values
(205, 4),
(205, 5),
(208, 4),
(209, 4)

declare @t2 Table(Pokazatel int, Priznak int, Rasshifrovka1 int,Rasshifrovka2 int)
insert @t2 values
(200, 1,null,null),
(200, 2,null,null),
(200, 3,null,null),
(205, 1,null,null),
(205, 2,null,null),
(205, 3,null,null),
(205, 4,  12,null),
(205, 5,  12,20),
(208, 1,null,null),
(208, 2,null,null),
(208, 3,null,null),
(208, 4  ,58,null)

declare @Pokazatel int, @Rasshifrovka1 int, @Rasshifrovka2 int
--select @Pokazatel=200, @Rasshifrovka1=0, @Rasshifrovka2=0
--select @Pokazatel=205, @Rasshifrovka1=0, @Rasshifrovka2=0
--select @Pokazatel=205, @Rasshifrovka1=12, @Rasshifrovka2=0 
--select @Pokazatel=205, @Rasshifrovka1=12, @Rasshifrovka2=20
--select @Pokazatel=205, @Rasshifrovka1=12, @Rasshifrovka2=22
--select @Pokazatel=208, @Rasshifrovka1=13, @Rasshifrovka2=0

select 1
from @t2
where Pokazatel = @Pokazatel
having SUM(case Priznak when 1 then 1 else 0 end) > 0
	and SUM(case Priznak when 2 then 1 else 0 end) > 0
	and SUM(case Priznak when 3 then 1 else 0 end) > 0
	and SUM(case when isnull(@Rasshifrovka1,0) = 0 or Rasshifrovka1 = @Rasshifrovka1 and Priznak = 4 then 1 else 0 end) > 0
	and SUM(case when isnull(@Rasshifrovka2,0) = 0 or Rasshifrovka2 = @Rasshifrovka2 and Priznak = 5 then 1 else 0 end) > 0	
20 окт 11, 19:23    [11475207]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли такое сделать одним запросом  [new]
iljy
Member

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

зачем тут Таблица1 - я в упор не понял...
20 окт 11, 19:23    [11475210]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли такое сделать одним запросом  [new]
_anybody
Guest
iljy
and SUM(case when isnull(@Rasshifrovka1,0) = 0 or Rasshifrovka1 = @Rasshifrovka1 and Priznak = 4 then 1 else 0 end) > 0
А если @Rasshifrovka1 = 0, а Rasshifrovka1 = 1?
20 окт 11, 22:40    [11475727]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли такое сделать одним запросом  [new]
iljy
Member

Откуда:
Сообщений: 8711
_anybody
iljy
and SUM(case when isnull(@Rasshifrovka1,0) = 0 or Rasshifrovka1 = @Rasshifrovka1 and Priznak = 4 then 1 else 0 end) > 0
А если @Rasshifrovka1 = 0, а Rasshifrovka1 = 1?

И? В этом случае сработает первая часть OR. У меня сложилось впечатление, что ТС не очень различает 0 и NULL. В любом случае условия легко корректируются.
20 окт 11, 23:40    [11475947]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли такое сделать одним запросом  [new]
Element2
Member

Откуда: Украина
Сообщений: 22
iljy,

Таблица @t1 определяет, по каким ещё признакам (кроме 1,2,3) должен производится поиск.
т.е. в нашем примере при таких значениях:
declare @Pokazatel int=200, @Rasshifrovka1 int=80, @Rasshifrovka2 int=90
declare @Pokazatel int=208, @Rasshifrovka1 int=58, @Rasshifrovka2 int=90
результат должен быть положительным (Rasshifrovka1 анализируется, если в @t1 найден признак 4, Rasshifrovka1+Rasshifrovka2 анализируются, если в @t1 найден признак 5).
21 окт 11, 11:05    [11476990]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли такое сделать одним запросом  [new]
iljy
Member

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

ну добавьте в условия наличия расшифровки проверку условий наличия записи с кодом 4 или 5 в таблице @t1.
21 окт 11, 11:12    [11477056]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить