Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.51/75: Рейтинг темы: голосов - 75, средняя оценка - 4.51
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451

Цикл по полученным данным

07.12.2009, 00:44. Показов 14304. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Пишу программу на C# + MS SQL. Делаю несложный запрос в БД вида
SQL
1
SELECT pole1, pole2, pole3 FROM myTable WHERE ((pole2 = "1") OR (pole2 = "2"))
тем самым получаю промежуточный набор нужных мне строк, которые в свою очередь нужно обработать в цикле. Если по-русски, то примерно так:
цикл (i = 0; i<(количество строк в полученном наборе - 1); i++)
если (строка[i+1].pole1 = строка[i].pole1)
тогда
удалить строка[i+1]
иначе
ничего не делать
конец цикла
Как это можно оформить на SQL и имеет ли смысл заморачиваться на этот счет? Может проще, удобнее и выгоднее будет сделать это средствами C#? Ну, например сделать запрос в БД, с помощью ридера закинуть данные в массив, а уже с массивом изгаляться?

Я запуталась, не знаю как лучше... Подскажите, пожалуйста. Жду наводящих вопросов.

Извините, если вопрос покажется глупым или уже обсуждался - я не нашла ничего подобного на форуме.

Заранее благодарю всех откликнувшихся!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.12.2009, 00:44
Ответы с готовыми решениями:

Создать подключение к БД по данным, полученным от пользователя
Всем доброго времени суток! Подскажите, пожалуйста, лучший способ реализации подключения к БД в следующей ситуации: На момент...

Как обратиться к данным, полученным из запроса к БД
Здравствуйте. такая проблема, я делаю запрос на поиск записи в БД Access. Как обратиться к результату запроса, т.е. если *найдена строка* -...

Как обратиться к данным XML, полученным из Excel
привет, форумчане ! создал xml из excel, вот : &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;true&quot;?&gt; -&lt;Root...

23
 Аватар для BasicMan
19318 / 2625 / 84
Регистрация: 17.02.2009
Сообщений: 30,364
07.12.2009, 11:23
обьявить 2 переменные @v1 и @v2
обьявить CURSOR : DECLARE CURSOR

пример Б. Использование вложенных курсоров для вывода отчета
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
SET NOCOUNT ON
 
DECLARE @vendor_id int, @vendor_name nvarchar(50),
    @message varchar(80), @product nvarchar(50)
 
PRINT '-------- Vendor Products Report --------'
 
DECLARE vendor_cursor CURSOR FOR 
SELECT VendorID, Name
FROM Purchasing.Vendor
WHERE PreferredVendorStatus = 1
ORDER BY VendorID
 
OPEN vendor_cursor
 
FETCH NEXT FROM vendor_cursor 
INTO @vendor_id, @vendor_name
 
WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT ' '
    SELECT @message = '----- Products From Vendor: ' + 
        @vendor_name
 
    PRINT @message
 
    -- Declare an inner cursor based   
    -- on vendor_id from the outer cursor.
 
    DECLARE product_cursor CURSOR FOR 
    SELECT v.Name
    FROM Purchasing.ProductVendor pv, Production.Product v
    WHERE pv.ProductID = v.ProductID AND
    pv.VendorID = @vendor_id  -- Variable value from the outer cursor
 
    OPEN product_cursor
    FETCH NEXT FROM product_cursor INTO @product
 
    IF @@FETCH_STATUS <> 0 
        PRINT '         <<None>>'     
 
    WHILE @@FETCH_STATUS = 0
    BEGIN
 
        SELECT @message = '         ' + @product
        PRINT @message
        FETCH NEXT FROM product_cursor INTO @product
        END
 
    CLOSE product_cursor
    DEALLOCATE product_cursor
        -- Get the next vendor.
    FETCH NEXT FROM vendor_cursor 
    INTO @vendor_id, @vendor_name
END 
CLOSE vendor_cursor
DEALLOCATE vendor_cursor
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
07.12.2009, 12:20
Лакшми,

SELECT возвращает неупорядоченный набор строк.
Поэтому непонятно, какие значения pole1 Вы сравниваете в цикле.
Задайте для начала порядок строк с помощью ORDER BY.
И назовите версию сервера. Никакого цикла или курсора здесь не понадобится. IMHO
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
08.12.2009, 00:24  [ТС]
CyberБурундукЪ, спасибо, попробую разобраться.
Цитата Сообщение от iap Посмотреть сообщение
Лакшми,
SELECT возвращает неупорядоченный набор строк.
Поэтому непонятно, какие значения pole1 Вы сравниваете в цикле.
Задайте для начала порядок строк с помощью ORDER BY.
И назовите версию сервера. Никакого цикла или курсора здесь не понадобится. IMHO
Прошу прощения, просто забыла написать здесь ORDER BY. Конечно же я сортирую, иначе цикл просто бессмысленный.
Вообще хотелось бы узнать ответ на более общий вопрос:
Цитата Сообщение от Лакшми Посмотреть сообщение
...имеет ли смысл заморачиваться на этот счет? Может проще, удобнее и выгоднее будет сделать это средствами C#?
Версию сервера смогу сказать только завтра.
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
08.12.2009, 09:08
Цитата Сообщение от Лакшми Посмотреть сообщение
CyberБурундукЪ, спасибо, попробую разобраться.

Прошу прощения, просто забыла написать здесь ORDER BY. Конечно же я сортирую, иначе цикл просто бессмысленный.
Вообще хотелось бы узнать ответ на более общий вопрос:

Версию сервера смогу сказать только завтра.
Судя по всему, Вы хотите удалить из таблицы дубли pole1, оставив первую строку в до сих пор неизвестном порядке (это секрет? ).
В таком случае это делается элементарно одним запросом и незачем загружать клиента, перебирать строк, удалять их по одной...
IMHO

Итак, хочется видеть ORDER BY и узнать результат
T-SQL
1
PRINT @@VERSION
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
09.12.2009, 20:50  [ТС]
Смысл цикла долго и сложно рассказывать. Дело даже не в том, чтобы удалять, там надо еще чего-то намудрить. Сам факт цикла интересен. И не последний по значимости вопрос остается открытым - имеет смысл или нет?

Версия 9.00.2047.00
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
09.12.2009, 22:09
Цитата Сообщение от Лакшми Посмотреть сообщение
Смысл цикла долго и сложно рассказывать. Дело даже не в том, чтобы удалять, там надо еще чего-то намудрить. Сам факт цикла интересен. И не последний по значимости вопрос остается открытым - имеет смысл или нет?

Версия 9.00.2047.00
Если не хотите нормально сформулировать вопрос и сообщить всё необходимое, то - увы!
Вам ничем не поможешь.
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
09.12.2009, 22:20  [ТС]
Это важно - что я хочу делать в цикле? Я думала нет. Если важно, то я попытаюсь.

В таблице строки идут попарно по полю1 (там дата и время). Но при сбое некоторые строки могут быть не парными. Или другие поля не отвечать требованиям. Мне нужно оставить только по одной строке из парных. Остальные в счет не брать, и вторые парные строки тоже. Так понятнее? Если нет, попробую еще подробнее описать.
0
 Аватар для BasicMan
19318 / 2625 / 84
Регистрация: 17.02.2009
Сообщений: 30,364
09.12.2009, 22:26
Лакшми, а ID_строки есть? или другое уникальное поле

если естьт, то эт все можно в одном запросе сделать и не понадобится никаких циклов
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
09.12.2009, 22:35  [ТС]
да, есть, конечно же
0
 Аватар для BasicMan
19318 / 2625 / 84
Регистрация: 17.02.2009
Сообщений: 30,364
09.12.2009, 22:50
T-SQL
1
2
3
4
5
6
delete table2
from mytable
left join mytable table2
on mytable.полe1 = table2.полe1 
where table2.полe1 is null
or table2.ID_строки > mytable.ID_строки
вот насчет последней части я не уверен (or table2.ID_строки > mytable.ID_строки), но непарные значения вы точно удалите
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
09.12.2009, 22:52  [ТС]
Ааа... Условие... Может быть некорректно. Потому что мало ли в каком порядке они там были записаны, потом же я их сортирую по полю1 и ID могут располагаться не по порядку. Разве нет?
0
 Аватар для BasicMan
19318 / 2625 / 84
Регистрация: 17.02.2009
Сообщений: 30,364
09.12.2009, 23:00
и что? ID, по-любому, будут одно больше, другое меньше
эт для удаления парных строк
а для удаления не парных условие table2.полe1 IS null
в принципе этот запрос лучше проводить над временной таблицей и еще лучше разбить на 2 запроса
на удаление сначала непарных, а потом парных строк
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
09.12.2009, 23:02  [ТС]
Я с SQL-ем не очень. Как сделать 2 запроса? Ведь результат запроса - набор строк. Так? Его куда-то можно временно положить, чтобы второй запрос с ним сделать? Или сделать вложенный запрос?
0
 Аватар для BasicMan
19318 / 2625 / 84
Регистрация: 17.02.2009
Сообщений: 30,364
09.12.2009, 23:04
в хранимую процедуру
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
create procedure XXX
as 
 
DELETE mytable
FROM mytable
LEFT join mytable table2
ON mytable.полe1 = table2.полe1 and table2.ID_строки <> mytable.ID_строки
WHERE table2.полe1 IS null
 
DELETE table2
FROM mytable
inner join mytable table2
ON mytable.полe1 = table2.полe1 and table2.ID_строки <> mytable.ID_строки
WHERE table2.ID_строки > mytable.ID_строки
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
09.12.2009, 23:06  [ТС]
Прошу прощения за глупость, а table2 у нас откуда взялась?
0
 Аватар для BasicMan
19318 / 2625 / 84
Регистрация: 17.02.2009
Сообщений: 30,364
09.12.2009, 23:10
а эт alias таблицы mytable
т.к. она сама к себе джойнится, то соответственно приходится ей во второй раз новый псевдоним давать
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
09.12.2009, 23:12  [ТС]
Простите еще разок... А где видно, что это ее алиас? Там просто пропущено слово AS?
0
 Аватар для BasicMan
19318 / 2625 / 84
Регистрация: 17.02.2009
Сообщений: 30,364
09.12.2009, 23:17
эт из бук онлайна
FROM Clause
Specifies the table(s) from which to retrieve rows. The FROM clause is required except when the select list contains only constants, variables, and arithmetic expressions (no column names). For more information, see FROM.

Syntax
[ FROM {<table_source>} [,...n] ]

<table_source> ::=
table_name [ [AS] table_alias ] [ WITH ( <table_hint> [,...n]) ]
| view_name [ [AS] table_alias ]
| rowset_function [ [AS] table_alias ]
| derived_table [AS] table_alias [ (column_alias [,...n] ) ]
| <joined_table>

<joined_table> ::=
<table_source> <join_type> <table_source> ON <search_condition>
| <table_source> CROSS JOIN <table_source>
| <joined_table>

<join_type> ::=
[ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]
[ <join_hint> ]
JOIN
AS - необязателен, хотя желателен
я лично его не ставлю для таблиц
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
09.12.2009, 23:18  [ТС]
Так. Я поняла что Вы хотели сказать. Спасибо за помощь! А на второй вопрос можете ответить - это делать целесообразно, или лучше средствами C# это сделать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.12.2009, 23:18
Помогаю со студенческими работами здесь

Изменить страницу, согласно полученным данным в формате JSON
kalabuni, пожалуйста помогите мне можно у вас спросить кое что? Правила форума

Как можно подобрать функциональную зависимость к экспериментально полученным данным
Скажите, пожалуйста, как можно подобрать функциональную зависимость к экспериментально полученным данным: 0 0 4 368 8 651,8 ...

Не работает цикл по полученным файлам из папки
Доброго времени суток! Работаю в небольшой организации, понадобилась небольшая прога.. написал для нее небольшую конструкцию.. но толи...

Цикл по данным из файла
Всем привет. Подскажите следующее: Имеется файл excel столбец A ( имя столбца id). Excel id 1312 32132 321321 3213465 ...

Создать программу по всем 3 видам циклов...цикл с параметром,цикл с условием,цикл,и цикл с предусловием...
Найти сумму чисел 1 в квадрате до 10 c квадрате...операцию возведению в степень не использовать учесть особенности получения квадратного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru