Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2017, 14:06   #1
Tagir93
Пользователь
 
Регистрация: 06.02.2017
Сообщений: 31
По умолчанию Сравнение двух таблиц MySQL и удаление повторяющихся значений

Помогите, пожалуйста!
Есть две таблицы
Tabl.jpg
Нужно сопоставить таблицы по столбцу code и cae и совпадающие строки удалить в tabl2.
В итоге в tabl2 должны остаться только уникальные значения code:
tabl2.jpg

Последний раз редактировалось Tagir93; 17.08.2017 в 14:16.
Tagir93 вне форума Ответить с цитированием
Старый 17.08.2017, 14:26   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
DELETE FROM tabl2 WHERE EXISTS(SELECT 0 FROM tabl1 WHERE tabl1.cae=tabl2.code)

DELETE tabl2 FROM tabl2,tabl1 WHERE tabl1.cae=tabl2.code

DELETE FROM tabl2 USING tabl2,tabl1 WHERE tabl1.cae=tabl2.code
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.08.2017, 14:54   #3
Tagir93
Пользователь
 
Регистрация: 06.02.2017
Сообщений: 31
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Код:
DELETE FROM tabl2 WHERE EXISTS(SELECT 0 FROM tabl1 WHERE tabl1.cae=tabl2.code)

DELETE tabl2 FROM tabl2,tabl1 WHERE tabl1.cae=tabl2.code

DELETE FROM tabl2 USING tabl2,tabl1 WHERE tabl1.cae=tabl2.code
Выдает ошибку
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DELETE tabl2 FROM tabl2, tabl1 WHERE tabl1' at line 3
Tagir93 вне форума Ответить с цитированием
Старый 17.08.2017, 14:58   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

во-первых, Вам написали три различных варианта. Вы все три проверили?

во-вторых, ваш пример не очень показателен.
поясню.
если в таблице Tabl2 будет запись
76 21 21
эту строчку нужно удалять?

а если будет запись
76 10 21
эту строчку нужно удалять?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.08.2017, 15:00   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
'DELETE tabl2 FROM tabl2,
delete FROM tabl2
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 17.08.2017, 15:02   #6
Tagir93
Пользователь
 
Регистрация: 06.02.2017
Сообщений: 31
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
во-первых, Вам написали три различных варианта. Вы все три проверили?

во-вторых, ваш пример не очень показателен.
поясню.
если в таблице Tabl2 будет запись
76 21 21
эту строчку нужно удалять?

а если будет запись
76 10 21
эту строчку нужно удалять?
Прошу прощения! Сразу не врубился, все три запроса работают.
76 10 21 тоже нужно удалять, тут главное 76
Tagir93 вне форума Ответить с цитированием
Старый 17.08.2017, 15:02   #7
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
check the manual
Написано же, куда идти за ответом...
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 17.08.2017, 15:03   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Написано же, куда идти за ответом...
уже поздно.
ответ дал evg_m в пост #5

ещё вариант
Код:
DELETE FROM tabl2 WHERE code In (SELECT cae FROM tabl1)
впрочем, это вариант явно хуже, чем
Код:
DELETE FROM `tabl2` WHERE EXISTS (SELECT 0 FROM tabl1 WHERE tabl1.cae=tabl2.code)

Последний раз редактировалось Serge_Bliznykov; 17.08.2017 в 15:09.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.08.2017, 14:47   #9
Rodini
Новичок
Джуниор
 
Регистрация: 05.06.2015
Сообщений: 2
По умолчанию Чем хуже?

Чем хуже?

ещё вариант
Код:

DELETE FROM tabl2 WHERE code In (SELECT cae FROM tabl1)

впрочем, это вариант явно хуже, чем
Код:

DELETE FROM `tabl2` WHERE EXISTS (SELECT 0 FROM tabl1 WHERE tabl1.cae=tabl2.code)
Rodini вне форума Ответить с цитированием
Старый 23.08.2017, 15:34   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

имхо, в общем случае - эффективностью.

в первом случае в подзапрос попадают ВСЕ коды из таблицы tabl1
потом из них делается выборка по code

во втором случае из таблицы tabl1 выбираются только те записи, для которых есть совпадение по коду.

конечно, это просто общее замечание.
конкретно нужно смотреть план запроса в том и другом случае.
А ещё всё будет сильно зависеть от наличия индекса (как минимум обязательно должен быть индекс в tabl1 по полю cae) и от того, много ли в tabl1 есть кодов cae для которых нет соответствующих кодов code в таблице tabl2.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление повторяющихся значений 27102014 Microsoft Office Excel 3 07.05.2015 10:07
Сравнение столбцов двух таблиц и копирование значений из одной в другую. cxx Microsoft Office Excel 2 10.02.2014 13:59
удаление из таблицы повторяющихся значений CodeNOT PHP 2 28.03.2011 12:01
Сравнение значений в 2х столбцах и удаление лишних значений.. Tyr Microsoft Office Excel 2 16.12.2010 18:19
Удаление повторяющихся значений в строке aimk0 Помощь студентам 7 11.10.2010 16:58