|
Циклы в СУБД
|
|||
---|---|---|---|
#18+
Доброе время суток, уважаемые постояльцы! Я в 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 цикла и сравнить каждую запись первой таблицы со всеми записями второй. При условии совпадения, удаляем записи в обеих таблицах и идем дальше по записям первой таблицы. Люди в гуглах говорят, что циклы в СУБД не рациональное решение. Подскажите пожалуйста, как решить. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2016, 15:52 |
|
Циклы в СУБД
|
|||
---|---|---|---|
#18+
nopalmsЛюди в гуглах говорятГоворят или чем-то обосновывают? а то говорить все мастера, а как до дела, так в тину... nopalmsкак решить.Для начала отбросить всякую бредятину типа nopalmsДанные в столбце id не интересны.Если реально неинтересны - сначала удали эти столбцы из структуры. И в данном случае два параллельных "курсора" по рекордсетам с сортировкой по Name вполне нормальное имхо решение... начального уровня. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2016, 15:58 |
|
Циклы в СУБД
|
|||
---|---|---|---|
#18+
AkinanopalmsЛюди в гуглах говорят Говорят или чем-то обосновывают? а то говорить все мастера, а как до дела, так в тину... http://forum.foxclub.ru/read.php?29,408455,page=1 тут, например. Ничем не обосновывают. AkinanopalmsДанные в столбце id не интересны. Если реально неинтересны - сначала удали эти столбцы из структуры. Они выполняют роль первичного ключа для каждой из таблиц. Ими можно воспользоваться в качестве счетчика, других идей на них не было. AkinaИ в данном случае два параллельных "курсора" по рекордсетам с сортировкой по Name вполне нормальное имхо решение... начального уровня. Спасибо за идею, пробую. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2016, 16:21 |
|
Циклы в СУБД
|
|||
---|---|---|---|
#18+
nopalmsОни выполняют роль первичного ключа для каждой из таблиц. Если на них нет ссылок в других таблицах, то ценность этих полей нулевая (кроме маловероятного случая, что нужно заполнить дисковое пространство хоть чем-нибудь, лишь бы не простаивало), и я бы предложил их удалить. А если ссылки есть - то фраза насчёт "Данные в столбце id не интересны" более чем непонятна. И в свете всего этого очень странно как существование двух однотипных (и не очень продуманных по структуре) таблиц, так и возможность помещения туда дублирующихся (да к тому же, как выясняется, ненужных) данных. В общем, что-то уж больно косое там в структуре, если не вообще в логике... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2016, 17:17 |
|
Циклы в СУБД
|
|||
---|---|---|---|
#18+
nopalms, авторМоя логика - сделать 2 цикла и сравнить каждую запись первой таблицы со всеми записями второй. непонятна метода t1t2idnameidname1Иванов1Петров2Иванов2Иванов3Петров3Сидоров4Петров4Сидоров5Иванов5Максимов6Сидоров6Ивано7Романов7Ивановрезультат:t1t2idnameidname4Петров4Сидоров5Иванов5Максимов7Романов6Ивано ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2016, 18:09 |
|
Циклы в СУБД
|
|||
---|---|---|---|
#18+
ПЕНСИОНЕРКАнепонятна метода Что-то типа Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2016, 18:16 |
|
Циклы в СУБД
|
|||
---|---|---|---|
#18+
Akina, принцип похож, но иной прочитали иванов в 1----ищем во втором,нащли --удалили оба(1 и 2) и вышли прочитали иванов ---нашли, вышли прочитали петров -нашли от начала, вышли прочинали еще петрова --не нашли, оставили ..... просто не могу представить, в какой задаче, это могло бы понадобится ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2016, 20:12 |
|
Циклы в СУБД
|
|||
---|---|---|---|
#18+
В третью таблицу залить intersect запросов поля name из 2ух таблиц. Получится перечень имен. Потом из каждой таблицы delete from .... where name in (select name from new_table) - но как считать что это то же самое имя с ошибкой, а не другое похожее - вопрос деликатный. При не слишком большом объеме целесообразна ручная выверка. Если логика базы позволяет вводить такие, дублирующие записи, чистку придется повторять. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2016, 21:07 |
|
Циклы в СУБД
|
|||
---|---|---|---|
#18+
ПЕНСИОНЕРКА, дык вроде мой недокод именно это и делает... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2016, 23:17 |
|
Циклы в СУБД
|
|||
---|---|---|---|
#18+
Попробуйте выполнить такой запрос: Код: sql 1.
А следом такой же, но t1 и t2 поменять местами. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2016, 09:35 |
|
Циклы в СУБД
|
|||
---|---|---|---|
#18+
АнатолийПопробуйте выполнить такой запрос: 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`а с учетом человеческого фактора. очень много фамилий. нужно периодически находить все "косяки" ввода. кто-то продублировал одного "особенного", кто-то ошибся в имени, кто-то из "особенных" перестал быть таковым. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2016, 12:47 |
|
Циклы в СУБД
|
|||
---|---|---|---|
#18+
nopalmsкак я понимаю, это id`шники?А текст запроса посмотреть не судьба? nopalmsсчетчик пройдет по второй таблице и выйдет?Может, и так. А, может, и по первой... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2016, 12:59 |
|
Циклы в СУБД
|
|||
---|---|---|---|
#18+
AkinaА текст запроса посмотреть не судьба? Понял, возвращает name, но как можно применить знак неравенства к текстовым значениям? vb плюется на эту строку. AkinaМожет, и так. А, может, и по первой.. я к тому, что этого условия достаточно, чтобы выйти из цикла, когда сравнится первое значение 1ой таблицы со всеми из 2ой. могу ошибаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2016, 13:30 |
|
Циклы в СУБД
|
|||
---|---|---|---|
#18+
nopalmsкак можно применить знак неравенства к текстовым значениям?Не поверишь! легко и непринуждённо... в соответствии с текущим Option Compare. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.05.2016, 15:15 |
|
Циклы в СУБД
|
|||
---|---|---|---|
#18+
Akina, Простите мне мою неграмотность. Не знал ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2016, 09:57 |
|
Циклы в СУБД
|
|||
---|---|---|---|
#18+
Модифицировал немного код 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, подскажите пожалуйста ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2016, 15:04 |
|
Циклы в СУБД
|
|||
---|---|---|---|
#18+
nopalmsне могу сообразить как отключить учет регистра знаков в записях. Akina, подскажите пожалуйста Эммм... я же говорил: Akinaв соответствии с текущим Option Compare ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2016, 15:48 |
|
|
start [/forum/topic.php?fid=45&msg=39241503&tid=1613538]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 334ms |
total: | 449ms |
0 / 0 |