powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите составить запрос с исключениями
26 сообщений из 26, показаны все 2 страниц
Помогите составить запрос с исключениями
    #39724834
Евгений.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Помогите составить запрос, если это возможно.

Есть таблица (справочник с шаблонами номеров):

provider | template
----------------------
p1 | 8
----------------------
p1 | 823
----------------------
p2 | 82
----------------------
p2 | 8234


Есть рабочая таблица (номера телефонов):

numb
--------
821111
822222
823333
823444

Необходимо составить запрос, который вернет из таблицы numb все телефоны, соответствующие оператору p1 , но не подпадающие под номера оператора p2 .
Заранее спасибо.
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724837
Евгений.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
уточнение: понятно что это упрощенный вариант, а на самом деле шаблонов и провайдеров неограниченно много.
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724839
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте начать с простейшего EXISTS/NOT EXISTS - для каждого телефона искать подходящие или не подходящие шаблоны...
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724842
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то типа
Код: sql
1.
provider  = 'p1' AND numb LIKE template  + '%' AND NOT EXISTS (SELECT 1 FROM t WHERE provider <> 'p1' AND LIKE template + '%' )
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724846
Евгений.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKчто-то типа
Код: sql
1.
provider  = 'p1' AND numb LIKE template  + '%' AND NOT EXISTS (SELECT 1 FROM t WHERE provider <> 'p1' AND LIKE template + '%' )


Таблица с провайдерами может меняться, поэтому не подходит использование конкретных провайдеров в запросе, иначе каждый раз надо будет переделывать запрос под текущие условия.
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724850
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений.TaPaKчто-то типа
Код: sql
1.
provider  = 'p1' AND numb LIKE template  + '%' AND NOT EXISTS (SELECT 1 FROM t WHERE provider <> 'p1' AND LIKE template + '%' )


Таблица с провайдерами может меняться, поэтому не подходит использование конкретных провайдеров в запросе, иначе каждый раз надо будет переделывать запрос под текущие условия.
ну так и поменяйте под то что вам надо, моя сова натянутая на шар предсказаний очень страдает
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724851
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKчто-то типа
Код: sql
1.
provider  = 'p1' AND numb LIKE template  + '%' AND NOT EXISTS (SELECT 1 FROM t WHERE provider <> 'p1' AND LIKE template + '%' )

записи "размножаться" в "Есть рабочая таблица (номера телефонов)" со всеми этими ТСовскими
p1 | 8
----------------------
p1 | 823



Код: sql
1.
2.
3.
4.
5.
select ...
from [Есть рабочая таблица (номера телефонов)] a
left join [Есть таблица (справочник с шаблонами номеров)] b on a.numb like b.template  + '%' and provider <> 'p1'
where b.provider is null
and exists(SELECT 1 FROM [Есть таблица (справочник с шаблонами номеров)] b1 WHERE b1.provider = 'p1' AND a.numb LIKE b1.template + '%' )
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724852
Евгений.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKну так и поменяйте под то что вам надо, моя сова натянутая на шар предсказаний очень страдает
Не знаю что там с совой, но менять запрос каждый раз как изменяются данные в таблице мне видится не разумным.
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724857
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений.Таблица с провайдерами может меняться, поэтому не подходит использование конкретных провайдеров в запросе, иначе каждый раз надо будет переделывать запрос под текущие условия.инлайн функция с параметром @provider
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724858
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений.TaPaKну так и поменяйте под то что вам надо, моя сова натянутая на шар предсказаний очень страдает
Не знаю что там с совой, но менять запрос каждый раз как изменяются данные в таблице мне видится не разумным.
как же печально нынче в сообществе sql...

если надо определить оператора для всех, уберите "provider = 'p1' " и добавьте t.provider <> a.provider
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724859
Евгений.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKЕвгений.пропущено...

Таблица с провайдерами может меняться, поэтому не подходит использование конкретных провайдеров в запросе, иначе каждый раз надо будет переделывать запрос под текущие условия.
ну так и поменяйте под то что вам надо, моя сова натянутая на шар предсказаний очень страдает
Согласен. Был не прав.
Посмотрю ваш вариант.
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724860
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений.TaPaKну так и поменяйте под то что вам надо, моя сова натянутая на шар предсказаний очень страдает
Не знаю что там с совой, но менять запрос каждый раз как изменяются данные в таблице мне видится не разумным.Вот это кто написал?ЕвгенийНеобходимо составить запрос, который вернет из таблицы numb все телефоны, соответствующие оператору p1, но не подпадающие под номера оператора p2.Вам так и сделали.
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724862
Евгений.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKЕвгений.пропущено...

Не знаю что там с совой, но менять запрос каждый раз как изменяются данные в таблице мне видится не разумным.
как же печально нынче в сообществе sql...

если надо определить оператора для всех, уберите "provider = 'p1' " и добавьте t.provider <> a.provider
Не стоит делать выводы о сообществе.
Я всего лишь зашел на форум попросить помощи.
Да и уже признал что был не прав.
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724864
Евгений.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iapЕвгений.пропущено...

Не знаю что там с совой, но менять запрос каждый раз как изменяются данные в таблице мне видится не разумным.Вот это кто написал?ЕвгенийНеобходимо составить запрос, который вернет из таблицы numb все телефоны, соответствующие оператору p1, но не подпадающие под номера оператора p2.Вам так и сделали.
Да да. Все правильно.
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724865
Евгений.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
courtTaPaKчто-то типа
Код: sql
1.
provider  = 'p1' AND numb LIKE template  + '%' AND NOT EXISTS (SELECT 1 FROM t WHERE provider <> 'p1' AND LIKE template + '%' )

записи "размножаться" в "Есть рабочая таблица (номера телефонов)" со всеми этими ТСовскими
p1 | 8
----------------------
p1 | 823



Код: sql
1.
2.
3.
4.
5.
select ...
from [Есть рабочая таблица (номера телефонов)] a
left join [Есть таблица (справочник с шаблонами номеров)] b on a.numb like b.template  + '%' and provider <> 'p1'
where b.provider is null
and exists(SELECT 1 FROM [Есть таблица (справочник с шаблонами номеров)] b1 WHERE b1.provider = 'p1' AND a.numb LIKE b1.template + '%' )


Спасибо. Похоже на правду.
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724910
Евгений.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
courtTaPaKчто-то типа
Код: sql
1.
provider  = 'p1' AND numb LIKE template  + '%' AND NOT EXISTS (SELECT 1 FROM t WHERE provider <> 'p1' AND LIKE template + '%' )

записи "размножаться" в "Есть рабочая таблица (номера телефонов)" со всеми этими ТСовскими
p1 | 8
----------------------
p1 | 823



Код: sql
1.
2.
3.
4.
5.
select ...
from [Есть рабочая таблица (номера телефонов)] a
left join [Есть таблица (справочник с шаблонами номеров)] b on a.numb like b.template  + '%' and provider <> 'p1'
where b.provider is null
and exists(SELECT 1 FROM [Есть таблица (справочник с шаблонами номеров)] b1 WHERE b1.provider = 'p1' AND a.numb LIKE b1.template + '%' )



Обнаружилась проблема в этом запросе :(
Если есть более широкая маска, то она не дает отобрать строки, соответствующие и более узкой маске.
Т.е. если в запрос подставить провайдера p2 , то вывод будет пустой, т.к. все отсекается соответствием маске 8 провайдера p1
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724935
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений.Т.е. если в запрос подставить провайдера p2 , то вывод будет пустой, т.к. все отсекается соответствием маске 8 провайдера p1 ну, дык, что не так ?
"всё по ТЗ" (с) :)
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724937
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений.courtпропущено...
записи "размножаться" в "Есть рабочая таблица (номера телефонов)" со всеми этими ТСовскими
p1 | 8
----------------------
p1 | 823



Код: sql
1.
2.
3.
4.
5.
select ...
from [Есть рабочая таблица (номера телефонов)] a
left join [Есть таблица (справочник с шаблонами номеров)] b on a.numb like b.template  + '%' and provider <> 'p1'
where b.provider is null
and exists(SELECT 1 FROM [Есть таблица (справочник с шаблонами номеров)] b1 WHERE b1.provider = 'p1' AND a.numb LIKE b1.template + '%' )



Обнаружилась проблема в этом запросе :(
Если есть более широкая маска, то она не дает отобрать строки, соответствующие и более узкой маске.
Т.е. если в запрос подставить провайдера p2 , то вывод будет пустой, т.к. все отсекается соответствием маске 8 провайдера p1
звучит так, что необходим приоритет масок
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724965
Евгений.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
courtЕвгений.Т.е. если в запрос подставить провайдера p2 , то вывод будет пустой, т.к. все отсекается соответствием маске 8 провайдера p1 ну, дык, что не так ?
"всё по ТЗ" (с) :)
Допускаю что мой косяк, не все описал - думал что это логично, что более узкая маска имеет больший приоритет, т.е. если номер соответствует маске 8 и 82 , то считается по маске 82 .
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724970
Евгений.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKзвучит так, что необходим приоритет масок
Да.

Или может быть как то проверять что маска сама не подпадает под другую маску и тогда не учитывать ее в JOIN.
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724984
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
типа такого что-то ...
Код: sql
1.
2.
3.
4.
5.
6.
7.
select distinct a.* 
from [Есть рабочая таблица (номера телефонов)] a
left join [Есть таблица (справочник с шаблонами номеров)] b on a.numb like b.template  + '%' and provider <> 'p1'
cross apply
    (SELECT top 1 len(b1.template) as len_template FROM [Есть таблица (справочник с шаблонами номеров)] b1
    WHERE b1.provider = 'p1' AND a.numb LIKE b1.template + '%' order by len(b1.template) desc) x
where b.provider is null or len(b.template)<x.len_template
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724993
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так будет на порядок лучше
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
;with cte as (
	select 
		b.template 
		,b.provider
	from [Есть таблица (справочник с шаблонами номеров)] b
	where	not exists(select 1 from [Есть таблица (справочник с шаблонами номеров)] b1 where b.template like b1.template+'%')
)
select a.* 
from [Есть рабочая таблица (номера телефонов)] a 
inner join cte on a.numb like cte.template+'%'
where cte.provider = 'p1'
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724995
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fix
courtтак будет на порядок лучше
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
;with cte as (
	select 
		b.template 
		,b.provider
	from [Есть таблица (справочник с шаблонами номеров)] b
	where	not exists(select 1 from [Есть таблица (справочник с шаблонами номеров)] b1 where b1.template like b.template+'%')
)
select a.* 
from [Есть рабочая таблица (номера телефонов)] a 
inner join cte on a.numb like cte.template+'%'
where cte.provider = 'p1'
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39724998
Евгений.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
courtтипа такого что-то ...
Код: sql
1.
2.
3.
4.
5.
6.
7.
select distinct a.* 
from [Есть рабочая таблица (номера телефонов)] a
left join [Есть таблица (справочник с шаблонами номеров)] b on a.numb like b.template  + '%' and provider <> 'p1'
cross apply
    (SELECT top 1 len(b1.template) as len_template FROM [Есть таблица (справочник с шаблонами номеров)] b1
    WHERE b1.provider = 'p1' AND a.numb LIKE b1.template + '%' order by len(b1.template) desc) x
where b.provider is null or len(b.template)<x.len_template



Круто. Вроде бы работает корректно, только поменял порядок сортировки DESC на ASC
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39725001
Евгений.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
courtfix
courtтак будет на порядок лучше
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
;with cte as (
	select 
		b.template 
		,b.provider
	from [Есть таблица (справочник с шаблонами номеров)] b
	where	not exists(select 1 from [Есть таблица (справочник с шаблонами номеров)] b1 where b1.template like b.template+'%')
)
select a.* 
from [Есть рабочая таблица (номера телефонов)] a 
inner join cte on a.numb like cte.template+'%'
where cte.provider = 'p1'



Первый пример (с сортировкой ASC) рабочий судя по тестам, сейчас попробую этот.
...
Рейтинг: 0 / 0
Помогите составить запрос с исключениями
    #39725013
Евгений.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
courtfix
courtтак будет на порядок лучше
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
;with cte as (
	select 
		b.template 
		,b.provider
	from [Есть таблица (справочник с шаблонами номеров)] b
	where	not exists(select 1 from [Есть таблица (справочник с шаблонами номеров)] b1 where b1.template like b.template+'%')
)
select a.* 
from [Есть рабочая таблица (номера телефонов)] a 
inner join cte on a.numb like cte.template+'%'
where cte.provider = 'p1'



Не работает - всегда пустой вывод :(
Возможно где то накосячил, еще поковыряю, но если что, остановлюсь на первом варианте.
Спасибо.
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите составить запрос с исключениями
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]