powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Циклы в СУБД
18 сообщений из 18, страница 1 из 1
Циклы в СУБД
    #39241497
nopalms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток, уважаемые постояльцы! Я в sql новичок, но в процессе. Столкнулся с задачей, над которой ломаю голову уже неделю, прошу помощи у опытных коллег, т.к. своих мозгов пока не хватает.
Задача такова:
- 2 одинаковые по структуре таблицы с разным количеством записей
- 2 столбца: id -ключ, name фамилии
- необходимо удалить строку из двух таблиц, если значения name совпадают.
- запись в name в обеих таблицах может неоднократно дублироваться, быть записана с ошибкой.

Например:
исходные данные
t1 t2
id name id name
1 Иванов 1 Петров
2 Иванов 2 Иванов
3 Петров 3 Сидоров
4 Петров 4 Сидоров
5 Иванов 5 Максимов
6 Сидоров 6 Ивано
7 Романов 7 Иванов

результат:
t1 t2
id name id name
4 Петров 4 Сидоров
5 Иванов 5 Максимов
7 Романов 6 Ивано

Данные в столбце id не интересны. Моя логика - сделать 2 цикла и сравнить каждую запись первой таблицы
со всеми записями второй. При условии совпадения, удаляем записи в обеих таблицах и идем дальше по записям
первой таблицы. Люди в гуглах говорят, что циклы в СУБД не рациональное решение. Подскажите пожалуйста, как
решить.
...
Рейтинг: 0 / 0
Циклы в СУБД
    #39241503
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopalmsЛюди в гуглах говорятГоворят или чем-то обосновывают? а то говорить все мастера, а как до дела, так в тину...

nopalmsкак решить.Для начала отбросить всякую бредятину типа
nopalmsДанные в столбце id не интересны.Если реально неинтересны - сначала удали эти столбцы из структуры.

И в данном случае два параллельных "курсора" по рекордсетам с сортировкой по Name вполне нормальное имхо решение... начального уровня.
...
Рейтинг: 0 / 0
Циклы в СУБД
    #39241529
nopalms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinanopalmsЛюди в гуглах говорят
Говорят или чем-то обосновывают? а то говорить все мастера, а как до дела, так в тину...

http://forum.foxclub.ru/read.php?29,408455,page=1
тут, например. Ничем не обосновывают.

AkinanopalmsДанные в столбце id не интересны.
Если реально неинтересны - сначала удали эти столбцы из структуры.
Они выполняют роль первичного ключа для каждой из таблиц. Ими можно воспользоваться в качестве счетчика, других идей
на них не было.

AkinaИ в данном случае два параллельных "курсора" по рекордсетам с сортировкой по Name вполне нормальное имхо решение... начального уровня.
Спасибо за идею, пробую.
...
Рейтинг: 0 / 0
Циклы в СУБД
    #39241581
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopalmsОни выполняют роль первичного ключа для каждой из таблиц.
Если на них нет ссылок в других таблицах, то ценность этих полей нулевая (кроме маловероятного случая, что нужно заполнить дисковое пространство хоть чем-нибудь, лишь бы не простаивало), и я бы предложил их удалить.
А если ссылки есть - то фраза насчёт "Данные в столбце id не интересны" более чем непонятна.

И в свете всего этого очень странно как существование двух однотипных (и не очень продуманных по структуре) таблиц, так и возможность помещения туда дублирующихся (да к тому же, как выясняется, ненужных) данных. В общем, что-то уж больно косое там в структуре, если не вообще в логике...
...
Рейтинг: 0 / 0
Циклы в СУБД
    #39241602
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopalms,


авторМоя логика - сделать 2 цикла и сравнить каждую запись первой таблицы
со всеми записями второй.
непонятна метода
t1t2idnameidname1Иванов1Петров2Иванов2Иванов3Петров3Сидоров4Петров4Сидоров5Иванов5Максимов6Сидоров6Ивано7Романов7Ивановрезультат:t1t2idnameidname4Петров4Сидоров5Иванов5Максимов7Романов6Ивано
...
Рейтинг: 0 / 0
Циклы в СУБД
    #39241608
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПЕНСИОНЕРКАнепонятна метода
Что-то типа
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
set rst1=openrecordset("select name from table1 order by 1")
set rst2=openrecordset("select name from table2 order by 1")
do
  if rst1.fields(0).value = rst2.fields(0).value then
    rst1.deleterecord
    rst2.deleterecord
  elseif rst1.fields(0).value > rst2.fields(0).value
    rst2.movenext
  else
    rst1.movenext
  end if
loop until rts1.eof or rst2.eof
...
Рейтинг: 0 / 0
Циклы в СУБД
    #39241696
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

принцип похож, но иной
прочитали иванов в 1----ищем во втором,нащли --удалили оба(1 и 2) и вышли
прочитали иванов ---нашли, вышли
прочитали петров -нашли от начала, вышли
прочинали еще петрова --не нашли, оставили
.....
просто не могу представить, в какой задаче, это могло бы понадобится
...
Рейтинг: 0 / 0
Циклы в СУБД
    #39241719
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В третью таблицу залить intersect запросов поля name из 2ух таблиц. Получится перечень имен. Потом из каждой таблицы delete from .... where name in (select name from new_table)
- но как считать что это то же самое имя с ошибкой, а не другое похожее - вопрос деликатный.

При не слишком большом объеме целесообразна ручная выверка.

Если логика базы позволяет вводить такие, дублирующие записи, чистку придется повторять.
...
Рейтинг: 0 / 0
Циклы в СУБД
    #39241761
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПЕНСИОНЕРКА, дык вроде мой недокод именно это и делает...
...
Рейтинг: 0 / 0
Циклы в СУБД
    #39241892
Попробуйте выполнить такой запрос:
Код: sql
1.
DELETE * FROM t1 As t3 WHERE Exists (SELECT * FROM t2 WHERE t2.[name] = t3.[name]) AND t3.id <> (SELECT Min(t1.id) FROM t1 WHERE t1.[name] = t3.[name])

А следом такой же, но t1 и t2 поменять местами.
...
Рейтинг: 0 / 0
Циклы в СУБД
    #39243135
nopalms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АнатолийПопробуйте выполнить такой запрос:
DELETE * FROM t1 As t3 WHERE Exists (SELECT * FROM t2 WHERE t2.[name] = t3.[name]) AND t3.id <> (SELECT Min(t1.id) FROM t1 WHERE t1.[name] = t3.[name])
А следом такой же, но t1 и t2 поменять местами.
В данном случае в таблице остаются записи с уникальным значением name, но в ситуации, например, наличия записей в
t1:
Иванов
Иванов
Иванов
а в t2:
Иванов

на выходе в t1 остается только одна запись "иванов", вместо двух.

Akina...elseif rst1.fields(0).value > rst2.fields(0).value
rst2.movenext...
как я понимаю, это id`шники?
Akinaloop until rts1.eof or rst2.eof
- счетчик пройдет по второй таблице и выйдет?

ПЕНСИОНЕРКАпросто не могу представить, в какой задаче, это могло бы понадобится
сотрудники из несмежных подразделений вносят фамилии "особенных людей" в форму access`а с учетом человеческого фактора. очень много фамилий. нужно периодически находить все "косяки" ввода. кто-то продублировал одного "особенного", кто-то ошибся в имени, кто-то из "особенных" перестал быть таковым.
...
Рейтинг: 0 / 0
Циклы в СУБД
    #39243155
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopalmsкак я понимаю, это id`шники?А текст запроса посмотреть не судьба?

nopalmsсчетчик пройдет по второй таблице и выйдет?Может, и так. А, может, и по первой...
...
Рейтинг: 0 / 0
Циклы в СУБД
    #39243189
nopalms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaА текст запроса посмотреть не судьба?
Понял, возвращает name, но как можно применить знак неравенства к текстовым значениям?
vb плюется на эту строку.
AkinaМожет, и так. А, может, и по первой..
я к тому, что этого условия достаточно, чтобы выйти из цикла, когда сравнится первое значение 1ой таблицы со всеми из 2ой.
могу ошибаться.
...
Рейтинг: 0 / 0
Циклы в СУБД
    #39243288
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopalmsкак можно применить знак неравенства к текстовым значениям?Не поверишь! легко и непринуждённо... в соответствии с текущим Option Compare.
...
Рейтинг: 0 / 0
Циклы в СУБД
    #39243693
nopalms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Простите мне мою неграмотность. Не знал
...
Рейтинг: 0 / 0
Циклы в СУБД
    #39244957
nopalms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Модифицировал немного код Akina:

Dim check As String
Set rst1 = CurrentDb.OpenRecordset("select * from t1 order by i")
Set rst2 = CurrentDb.OpenRecordset("select * from t2 order by i")
rst1.OpenRecordset
rst2.OpenRecordset

Do
Do
'MsgBox "rst1.id= " & rst1.Fields("i").Value & ", rst2.id= " & rst2.Fields("i").Value

If rst1.Fields("n").Value = rst2.Fields("n").Value Then

With rst1
.Edit
!n = Null
.Update
End With
With rst2
.Edit
!n = Null
.Update
End With

End If

rst2.MoveNext
Loop Until rst2.EOF
rst1.MoveNext
rst2.MoveFirst

Loop Until rst1.EOF

rst1.Close
rst2.Close

End Sub

Работает. Но не могу сообразить как отключить учет регистра знаков в записях.
Akina, подскажите пожалуйста
...
Рейтинг: 0 / 0
Циклы в СУБД
    #39245029
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nopalmsне могу сообразить как отключить учет регистра знаков в записях.
Akina, подскажите пожалуйста
Эммм... я же говорил:
Akinaв соответствии с текущим Option Compare
...
Рейтинг: 0 / 0
Циклы в СУБД
    #39245125
nopalms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Option compare Text
спасибо
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Циклы в СУБД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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