:: Не фоксом единым
Задачка SQL-щикам для тренировки
tata
Автор

Сообщений: 3521
Откуда: Йошкар-Ола
Дата регистрации: 23.10.2005
Требуется написать SQL-запрос, выводящий список клиентов, для которых в таблице документов нет записи с типом "СНИЛС", не используя при этом подзапросы.
Таблица CLIENTS имеет вид:
ID NAME
1 Иванов
2 Петров
3 Сидоров
4 Ломоносова
5 Веган

Таблица DOCS имеет вид:
ID ID_CLIENT DOC_TYPE DOC_NUM
1 1 'ПАСПОРТ' '1245 12'
2 1 'СНИЛС' '123-123'
3 2 'ПАСПОРТ' '1277 12'
4 3 'СНИЛС' '123-333'
5 5 'ЗАГРАН' '567444'

У меня только с подзапросом получается, т.е. задача не решена.

WITH clients
as
(
SELECT 1 ID, 'Иванов' NAME
UNION ALL
SELECT 2, 'Петров'
UNION ALL
SELECT 3, 'Сидоров'
UNION ALL
SELECT 4, 'Ломоносова'
UNION ALL
SELECT 5, 'Веган'
),
docs
as(
SELECT 1 ID, 1 ID_CLIENT, 'ПАСПОРТ' DOC_TYPE, '1245 12' DOC_NUM
UNION ALL
SELECT 2, 1, 'СНИЛС','123-123'
UNION ALL
SELECT 3, 2, 'ПАСПОРТ', '1277 12'
UNION ALL
SELECT 4, 3, 'СНИЛС', '123-333'
UNION ALL
SELECT 5, 5, 'ЗАГРАН', '567444'
)
SELECT c.*
FROM CLIENTS c
WHERE (CASE WHEN (SELECT 1 FROM docs d WHERE d.ID_CLIENT = c.ID And d.DOC_TYPE = 'СНИЛС' ) =1 THEN 1 ELSE 0 END) = 0
Ratings: 0 negative/0 positive
Re: Задачка SQL-щикам для тренировки
PuMa

Сообщений: 156
Откуда: Комсомольск-на-А
Дата регистрации: 19.04.2006
в FoxPro я бы сделал так
create cursor Clients ( ID I, NAME C(50) )
insert into Clients ( ID, NAME ) values ( 1, 'Иванов' )
insert into Clients ( ID, NAME ) values ( 2, 'Петров' )
insert into Clients ( ID, NAME ) values ( 3, 'Сидоров' )
insert into Clients ( ID, NAME ) values ( 4, 'Ломоносова' )
insert into Clients ( ID, NAME ) values ( 5, 'Веган' )
create cursor Docs ( ID I, ID_CLIENT I, DOC_TYPE C(20), DOC_NUM C(20) )
insert into Docs ( ID, ID_CLIENT, DOC_TYPE, DOC_NUM ) values ( 1, 1, 'ПАСПОРТ', '1245 12' )
insert into Docs ( ID, ID_CLIENT, DOC_TYPE, DOC_NUM ) values ( 2, 1, 'СНИЛС', '123-123' )
insert into Docs ( ID, ID_CLIENT, DOC_TYPE, DOC_NUM ) values ( 3, 2, 'ПАСПОРТ', '1277 12' )
insert into Docs ( ID, ID_CLIENT, DOC_TYPE, DOC_NUM ) values ( 4, 3, 'СНИЛС', '123-333' )
insert into Docs ( ID, ID_CLIENT, DOC_TYPE, DOC_NUM ) values ( 5, 5, 'ЗАГРАН', '567444' )
select c.ID;
, c.NAME;
, sum( cast( iif( isnull( d.DOC_TYPE ) == .f. and d.DOC_TYPE == 'СНИЛС', 1, 0 ) as I ) ) as CNT_SNILS;
from Clients c left outer join;
Docs d on d.ID_CLIENT == c.ID;
group by c.ID, c.NAME;
having CNT_SNILS == 0
Ratings: 0 negative/1 positive
Re: Задачка SQL-щикам для тренировки
MikhsR

Сообщений: 16
Откуда: Москва
Дата регистрации: 19.12.2022
Ну разве что для тренировки.
На T-SQL :

Select a.id, a.Name From Clients a
Left Join Docs b On (a.id=b.id_client) And (Doc_type='СНИЛС')
Where b.Doc_type Is Null
Ratings: 0 negative/0 positive
Re: Задачка SQL-щикам для тренировки
sphinx

Сообщений: 32802
Откуда: Екатеринбург
Дата регистрации: 22.11.2006
Визуально выглядит намного лаконичнее, чем вариант PuMa.

А проверяли на тестовых данных ТС?


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Задачка SQL-щикам для тренировки
sphinx

Сообщений: 32802
Откуда: Екатеринбург
Дата регистрации: 22.11.2006
sphinx
Визуально выглядит намного лаконичнее, чем вариант PuMa.
А проверяли на тестовых данных ТС?

P.S. И логичнее. Наверное все увидели ответ - и не стали писать свои варианты. Хотя чаще до соревнований доходит - у кого быстрее запрос, у кого ноги длиннее, кто дальше плюнет. Иногда участвую, если не в конце прочитал решения.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Задачка SQL-щикам для тренировки
MikhsR

Сообщений: 16
Откуда: Москва
Дата регистрации: 19.12.2022
sphinx
А проверяли на тестовых данных ТС?
Да.
Ratings: 0 negative/0 positive
Re: Задачка SQL-щикам для тренировки
sphinx

Сообщений: 32802
Откуда: Екатеринбург
Дата регистрации: 22.11.2006
Сравню оба варианта.

Татьяне может не актуально уже, но мы за правильные решения, если есть варианты.

Спасибо!


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 5 (Гостей: 5)

© 2000-2025 Fox Club 
Яндекс.Метрика