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

Откуда:
Сообщений: 271
Подскажите пожалуйста, как наиболее правильно перестроить запрос, чтобы в результате получить данные, которые не подпадают под маски таблицы @banc?
Отсутствие совпадений нужно одновременно по трем столбцам exte, Benef и Cli.
В таблице 76 - список проводок (платежей и данных по договорам)


DECLARE @DatePaymentfrom date, @DatePaymenttill date;
SET  @DatePaymentfrom = '20140101'
SET  @DatePaymenttill = '20141031';

DECLARE @banc TABLE (mask1 NVARCHAR(100), mask2 NVARCHAR(100),name NVARCHAR(100));
INSERT @banc (mask1,mask2, name) VALUES 
  
  (N'рога','рага',  N'Другие'),
  (N'копыта','капыта',  N'Другие');

SELECT  month( t.[DatePosting]) as 'Месяц',  b.name as 'Банк', sum (t.[76.1]) as 'Начислено'
           FROM [data].[dbo].[76]  t
           left join [Plans].[dbo].[vid_mask] v on t.vid like v.mask
           right JOIN @banc b ON  t.exte LIKE b.mask1  OR t.Benef LIKE b.mask1  OR t.Cli LIKE b.mask1 or
		         t.exte LIKE  b.mask2  OR t.Benef   LIKE  b.mask2 OR t.Cli LIKE b.mask2
           WHERE  t.[DatePosting] between  @DatePaymentfrom and  @DatePaymenttill 
	GROUP BY  month( t.[DatePosting]) , b.name


Может лучше создать @banc с одним полем масок?..

(N'рога'),
,(N'рага')
,(N'копыта')
,('капыта');
25 ноя 14, 12:40    [16901220]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на исключение данных по маске  [new]
Glory
Member

Откуда:
Сообщений: 104751
2viper2viper
Может лучше создать @banc с одним полем масок?..

Лучше
25 ноя 14, 12:41    [16901233]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на исключение данных по маске  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Glory
2viper2viper
Может лучше создать @banc с одним полем масок?..

Лучше

Уже так и сделал.

То есть, нужно исключить те записи, по которым встречается хотя бы одно совпадение по любому с трех полей по любой маске, и при этом результат не затраивался
25 ноя 14, 12:50    [16901300]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на исключение данных по маске  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
2viper2viper,

NOT EXISTS()
25 ноя 14, 12:53    [16901323]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на исключение данных по маске  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
iap
2viper2viper,

NOT EXISTS()
Даже скорее всего так:
NOT EXISTS(SELECT * FROM ... WHERE ... LIKE ... UNION ALL ... SELECT * FROM ... WHERE ... LIKE ... UNION ALL ...)
Только у Вас маски какие-то странные (без %[]_ и т.п.)
25 ноя 14, 12:57    [16901359]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на исключение данных по маске  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
iap, огромное Спасибо за помощь
запрос составил по аналогии:

 WHERE  t.[DatePosting] between  @DatePaymentfrom and  @DatePaymenttill and t.LB3 = @LB and
		   t.Contract not in 
		   (
		   SELECT t.Contract FROM [data].[dbo].[76]  t
                          right JOIN @banc b ON  t.externalchannel LIKE b.mask1  OR t.Beneficiary LIKE b.mask1  OR t.Insurer LIKE b.mask1 or
		         t.externalchannel  LIKE  b.mask2  OR t.Beneficiary   LIKE  b.mask2 OR t.Insurer LIKE b.mask2
           WHERE  t.[DatePosting] between  @DatePaymentfrom and  @DatePaymenttill and t.LB3 = @LB 
	       )
25 ноя 14, 13:41    [16901786]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на исключение данных по маске  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
iap, маски для сообщения на форуме упростил
25 ноя 14, 13:41    [16901795]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на исключение данных по маске  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
2viper2viper
iap, огромное Спасибо за помощь
запрос составил по аналогии:

 WHERE  t.[DatePosting] between  @DatePaymentfrom and  @DatePaymenttill and t.LB3 = @LB and
		   t.Contract not in 
		   (
		   SELECT t.Contract FROM [data].[dbo].[76]  t
                          right JOIN @banc b ON  t.externalchannel LIKE b.mask1  OR t.Beneficiary LIKE b.mask1  OR t.Insurer LIKE b.mask1 or
		         t.externalchannel  LIKE  b.mask2  OR t.Beneficiary   LIKE  b.mask2 OR t.Insurer LIKE b.mask2
           WHERE  t.[DatePosting] between  @DatePaymentfrom and  @DatePaymenttill and t.LB3 = @LB 
	       )
НИКОГДА не применяйте конструкцию NOT IN(SELECT ...)
ВСЕГДА заменяйте её на NOT EXISTS(SELECT ...)
Например, в данном случае t.Contract - в левой таблице RIGHT JOINа, а, значит, хоть один NULL там, да появится.
Что вернёт NOT IN(), если хотя бы одно значение в списке равно NULL, знаете?
И, кстати, не понимаю, зачем применять RIGHT JOIN? LEFT JOIN выглядит привычнее.
25 ноя 14, 13:53    [16901908]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на исключение данных по маске  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
2viper2viper,

хотя, смотрю, а Вы, оказывается, накладываете ограничение на поле левой таблицы RIGHT JOINа в WHERE!
И, таким образом, отбрасываете все NULLы, которые появились из-за RIGHT JOIN.
Превращаете RIGHT JOIN в INNER JOIN другими словами. Какой в этом смысл? Просвятите нас, будьте любезны.
25 ноя 14, 13:56    [16901941]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на исключение данных по маске  [new]
2viper2viper
Member

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

такой конструкцией запроса выгружаются платежи по банкам во временной таблице @banc с таблицы [76] одновременно по трем полям таблицы по нескольким маскам.
null-значения не возникаю.
вчера перепроверил результат при использовании not in (select..). он вроде верный
26 ноя 14, 20:43    [16910450]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на исключение данных по маске  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
2viper2viper
он вроде верный


но медленный
26 ноя 14, 21:01    [16910504]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на исключение данных по маске  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
единственное я не пойму почему для временных таблиц NOT EXISTS будет работать, Microsoft решил что и так быстро в памяти
26 ноя 14, 23:43    [16911163]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить