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

Откуда:
Сообщений: 43
Добрый день, sqlчане!

Кто может подсказать.

Есть таблица tt

Country || City || Столица

Россия || Казань
Россия || Москва
Россия || Саратов
США || Вашингтон
Германия || Берлин
Германия || Дрезден
Германия || Франкфурт
Франция || Ницца

Запрос вида (одна стран-один город) идет во внешнюю систему. Оттуда приходит крыж, если столица "да" иначе пусто. В виде xml (страна - да), но можно и в sql таблицу записать.

По тем странам, по которым пришел ответ "да", запрос не отправлять.
Следующий запрос такой же отправлять, но уже страну с другим городом если есть.

Подскажите Каким образом можно реализовать данную выборку?


На ум приходит добавить поле Флаг в таблицу.

Пока кол-во записей >0
Запрос.
Если пришел ответ "да",
то update флаг=1 по полю страна,
если пусто то update флаг=1 по полю страна и город.

Select country, max(city) from tt where flag=0 group by city order by city

Но можно и правильно ли так релизовать select в цикле непонятно.
20 сен 19, 16:18    [21975551]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в цикле  [new]
Щукина Анна
Member

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

Курсор же, а не цикл.
20 сен 19, 16:35    [21975571]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в цикле  [new]
hunty82
Member

Откуда:
Сообщений: 43
Курсор работате для каждой строки.
А тут необходимо оптимально минимальное кол-вом запросов.
Т.е первый запрос отправит:
Россия-Казань
США-Вашингтон
Германия-Берлин
Франция- Ницца

Ответ придет по США и Германии

Второй запрос
Россия-Москва

И все.
20 сен 19, 16:44    [21975586]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в цикле  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
hunty82,

ну и отправляйте, по одной стране пока не получите +, потом следующую. Sql тут что делать должне
20 сен 19, 16:50    [21975594]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в цикле  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4727
hunty82,

Опять зашел любитель циклов в БД. Может надо теорию БД почитать сначала и по-другому начать мыслить.
20 сен 19, 17:02    [21975606]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в цикле  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
А что, страны уже начали столицы как перчатки менять?
https://ru.wikipedia.org/wiki/Список_столиц_мира

Ну а если задача "высосана" из пальца, и там совсем другое, то CURSOR вам в руки
20 сен 19, 17:18    [21975618]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в цикле  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
hunty82
Курсор работате для каждой строки.
А тут необходимо оптимально минимальное кол-вом запросов.
В исходном посте вы описали действия "на каждую строку".
Или вам нужно одним запросом сделать какую то выборку?
20 сен 19, 21:22    [21975750]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в цикле  [new]
hunty82
Member

Откуда:
Сообщений: 43
В таблице могут быть несколько тысяч записей. Страна и город как пример.
Выборка группировкой по странам и городам одним запросом сразу по всем. Т.е не на каждую строчку

Я не любитель циклов, просто приходит на ум только такое действие и понимаю, что в бд это довольно коохозно. Поэтому и спросил.
20 сен 19, 22:19    [21975779]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в цикле  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
hunty82
Выборка группировкой по странам и городам одним запросом сразу по всем. Т.е не на каждую строчку
Так и делайте одним запросом.
Непонятно, в чём вопрос.
20 сен 19, 22:36    [21975790]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в цикле  [new]
Щукина Анна
Member

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

«В правильно сформулированном вопросе содержится половина ответа»(с)

Попробуйте переформулировать ваш вопрос в соответствии с рекомендациями, пункт 6. На адекватном репрезентативном, а не абстрактном, наборе данных.
И не нужно рассказывать, КАК вы пытаетесь решить задачу. Лучше сосредоточитесь на том, что есть и что должно получиться после всех ваших манипуляций.
21 сен 19, 06:20    [21975842]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в цикле  [new]
Interloper
Member

Откуда: Москва
Сообщений: 544
hunty82,

"Внешняя система" - это что? Если таблица в linked server, можно построить выборку с соединением по стране и признаку "столица".
23 сен 19, 16:14    [21977059]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в цикле  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
hunty82,

Задача чисто академическая и явно высосона из пальца. Внешняя система которая принимает запрос в таком виде это полный бред. По стране(ам) она должна возвращать столицу. Все! Скажите вашему преподу чтобы убился головой об стену.

Но если уж очень хочется - делайте как описали с флагом. В тупом цикле (никаких курсоров) по условию EXISTS(SELECT * FROM tt WHERE flag =0)
23 сен 19, 22:57    [21977376]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в цикле  [new]
4d_monster
Member

Откуда: Москва
Сообщений: 1613
Mind
Скажите вашему преподу чтобы убился головой об стену.

А вдруг он и есть препод?
24 сен 19, 08:15    [21977475]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в цикле  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20527
Выполняем

WITH cte AS (SELECT *, ROW_NUMBER() OVER (PARTITION BY country ORDER BY city) rn
             FROM source
             WHERE capital IS NULL)
SELECT country, city FROM cte WHERE rn=1

Отправляем.
Получаем ответ.
Далее для тех, на кого пришёл ответ, проставляем в поле capital единицу, остальным ноль. Типа


UPDATE source
SET capital = CASE WHEN EXISTS (SELECT 1 FROM answer WHERE answer.city = source.city) THEN 1 ELSE 0 END)

Повторяем, пока первый запрос возвращает хотя бы одну запись.
24 сен 19, 09:05    [21977503]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в цикле  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20527
Пардон, UPDATE должен апать только те записи, которые попали в отправленную выборку. Но это, надеюсь, Вы сможете поправить?
24 сен 19, 09:40    [21977537]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в цикле  [new]
hunty82
Member

Откуда:
Сообщений: 43
Akina, спасибо. Попробую.

Запрос в виде xml отправляется во внешнюю систему (не sql), оттуда приходит также xml с ответом. Парсится и записывается в таблицу. Необходимо наименьшее оптимальное кол-во запросов для заполнения всех записей.

Не препод и не студнет. По факту в задаче конечно не города и страны,а узко экономические показатели, но смысл такой же, они просто более художественны в восприятии.
24 сен 19, 23:51    [21978506]     Ответить | Цитировать Сообщить модератору
 Re: Выборка в цикле  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
hunty82
Необходимо наименьшее оптимальное кол-во запросов для заполнения всех записей.
Это относится не к оптимальному написанию запросов к MSSQL, а к взаимодействию с этими внешними системами.

Например, если системы позволяют написать "групповой запрос", то можно группировать запрос по системам, и отсылать по одному запросу на систему.

Если же такой возможности нет, то "наименьшее кол-во запросов для заполнения всех записей" будет равно количеству записей, какие ещё варианты?
25 сен 19, 08:21    [21978564]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить