SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 12.08.2014 19:23:16

inmerdorm
Участник
Зарегистрирован: 12.08.2014
Сообщений: 24

помогите написать слияние таблиц

Здравствуйте.
Помогите пожалуйста написать скрипт.

Есть две таблицы, t1 и t2. В таблице t1 есть primary key, в t2 нету. Столбцы в t1: PK, A1, A2, A3, A4, A5, A6; столбцы A* могут иметь null. Столбцы в t2: B1,B2,B3
Нужно:добавить в t1 такие строки, в которых значение B1 никогда не присутствует\не повторяется в A1. то есть в A1 все значения -уникальные. Значения в В1 могут повторяться.
Надо бы сразу подумать еще над тем, что таблица t1 может вследствие этих операций вырастать (тысячи, десятки тысяч строк), и скрипт в идеале не должен тормозить систему.

Заранее спасибо )

Отредактированно inmerdorm (12.08.2014 19:25:49)

Неактивен

 

#2 12.08.2014 19:26:26

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: помогите написать слияние таблиц

Здравствуйте.

Приведите небольшой тестовый набор данных для таблиц t1 и t2. И какой результат должен получиться в t1 после выполнения запроса.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 12.08.2014 19:35:25

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: помогите написать слияние таблиц

to deadka
Так скучно, предлагаю сыграть в "угадай, что нужно автору". Я отгадаю с первой попытки smile

insert into t1 (a1,a2,a3) select b1,b2,b3 from t2 left join t1 on a1=b1 where a1 is null group by b1;

Неактивен

 

#4 12.08.2014 20:13:15

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: помогите написать слияние таблиц

Отличная попытка!

А мы знаем, что в primary key идёт дефолтное значение типа auto_increment?
И насчет повторений значений в B1... ТС пишет, что могут повторяться, тогда по какому критерию будет происходить вставка значение B2 и B3? Исключительно интересно было бы все же получить от ТС тестовый набор, как он себе его видит.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 12.08.2014 20:20:34

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: помогите написать слияние таблиц

Свечку конечно не держал, потому воспользуемся бритвой оккама и будем ждать решения судьи smile

Неактивен

 

#6 12.08.2014 22:24:02

inmerdorm
Участник
Зарегистрирован: 12.08.2014
Сообщений: 24

Re: помогите написать слияние таблиц

deadka написал:

Здравствуйте.

Приведите небольшой тестовый набор данных для таблиц t1 и t2. И какой результат должен получиться в t1 после выполнения запроса.

Все поля в обоих таблицах - текстовые значения. в PK таблицы t1 - порядковые целые номера от 1 с шагом в 1.

Исходеные данные:
t1:
PK    A1      A2            A3                A4              A5       
1    Вася    Васильев Васильевич     отличник    инженер
2    Петя    Петров    Петрович        двоечник    художник
3    Миша   Мишин    Михайлович     хорошист    артист

t2:
B1           B2            B3
Вася       Иванов       Сергеевич
Миша      Петров       Андреевич
Алексей  Сергеев   

желаемый результат:
t1:
PK    A1          A2                 A3                   A4                 A5       
1    Вася         Васильев       Васильевич        отличник    инженер
2    Петя         Петров          Петрович           двоечник    художник
3    Миша       Мишин           Михайлович       хорошист    артист
4   Алексей   Сергеев

Неактивен

 

#7 12.08.2014 22:31:29

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: помогите написать слияние таблиц

А какая строка должна быть вставлена, если t2 имеет вид

t2:
B1           B2            B3
Вася       Иванов       Сергеевич
Миша      Петров       Андреевич
Алексей  Сергеев   
Алексей  Михайлович

Неактивен

 

#8 12.08.2014 22:33:06

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: помогите написать слияние таблиц

Да-да, я именно об этом. Вопрос к ТС -  у primary key, как я понял, стоит аттрибут auto_increment?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 12.08.2014 22:49:42

inmerdorm
Участник
Зарегистрирован: 12.08.2014
Сообщений: 24

Re: помогите написать слияние таблиц

vasya написал:

А какая строка должна быть вставлена, если t2 имеет вид

t2:
B1           B2            B3
Вася       Иванов       Сергеевич
Миша      Петров       Андреевич
Алексей  Сергеев   
Алексей  Михайлович

первая:
Алексей  Сергеев   

deadka написал:

Да-да, я именно об этом. Вопрос к ТС -  у primary key, как я понял, стоит аттрибут auto_increment?

Могу да, могу нет )
Видимо, нужно установить.

Отредактированно inmerdorm (12.08.2014 22:50:41)

Неактивен

 

#10 12.08.2014 22:53:38

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: помогите написать слияние таблиц

Если исходить из использования запроса от vasya, то, нужно установить auto_increment. Ну или другое значение по умолчанию.

первая: Алексей  Сергеев

Тогда видимо как-то так.

INSERT INTO `t1` (`a1`,`a2`,`a3`) SELECT `b1`,min(`b2`),min(`b3`) FROM `t2` LEFT JONI t1 ON a1=b1 WHERE `a1` IS NULL GROUP BY `b1`;


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#11 12.08.2014 22:58:28

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: помогите написать слияние таблиц

to deadka
имхо, ты не прав - min от строки?

изначальный вариант будет работать правильно, так как случайным образом возьмет "первую" строку. В кавычках, так как это понятие некорректно, так же как и в исходной постановке задачи.

Неактивен

 

#12 12.08.2014 23:07:19

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: помогите написать слияние таблиц

Что-то я глупость написал, вопрос не в строке, а в том, что такое использование групповых функций даст не первую строку из массива повторяющихся строк, а строку, сформированную из минимальных значений в массиве (например, один столбец из одной строки, второй из другой).

Неактивен

 

#13 12.08.2014 23:07:48

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: помогите написать слияние таблиц

Ммм... Так-то оно так.

Но замечу, что твой запрос  позволителен лишь в MySQL (тот же слон не пропустит такой запрос ) и не в режиме ONLY_FULL_GROUP_BY. Стоит ли учить плохому? smile

С min тоже по умолчанию будет ошибка, да, я ошибся.
Может по мотивам твой же статьи соберем AnsiSQL-совместимое решение?

Топикстартеру тогда вопрос: по какому критерию должен быть выбран Алексей Сергеев? У него минимальный id (primary key) или как?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#14 12.08.2014 23:44:37

inmerdorm
Участник
Зарегистрирован: 12.08.2014
Сообщений: 24

Re: помогите написать слияние таблиц

deadka написал:

Топикстартеру тогда вопрос: по какому критерию должен быть выбран Алексей Сергеев? У него минимальный id (primary key) или как?

Не важно. Как вам удобнее. главное, чтобы не было повторяющихся значений в столбце a1

Отредактированно inmerdorm (12.08.2014 23:45:29)

Неактивен

 

#15 12.08.2014 23:47:28

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: помогите написать слияние таблиц

Нам хоть как удобно... вопрос не в нашем удобстве. У Вас запрос от vasya нормально отработал?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#16 12.08.2014 23:47:40

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: помогите написать слияние таблиц

deadka написал:

Может по мотивам твой же статьи соберем AnsiSQL-совместимое решение?

Для корректной постановки нужно менять исходные, например, auto_increment primary key во второй таблице.


to inmerdorm, посмотрите http://sqlinfo.ru/articles/info/18.html

Неактивен

 

#17 12.08.2014 23:48:14

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: помогите написать слияние таблиц

inmerdorm написал:

главное, чтобы не было повторяющихся значений в столбце a1

Задайте ему уникальный ключ - это будет гарантия.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#18 12.09.2014 15:45:19

inmerdorm
Участник
Зарегистрирован: 12.08.2014
Сообщений: 24

Re: помогите написать слияние таблиц

извиняюсь, господа, долго отсутствовал.

deadka написал:

Нам хоть как удобно... вопрос не в нашем удобстве. У Вас запрос от vasya нормально отработал?

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

Отредактированно inmerdorm (12.09.2014 15:48:14)

Неактивен

 

#19 12.09.2014 17:21:35

inmerdorm
Участник
Зарегистрирован: 12.08.2014
Сообщений: 24

Re: помогите написать слияние таблиц

Технически, работает следующий запрос:

insert into t1 (A1, A2, A3)
select B1, B2, B3 from t2
where t2.B1 not in
(select A1 from t1)
group by B1

не будет ли это тормозить с большим количеством данных, как думаете?
имею в виду, t1 от 10-20 тыс, t2 от 100 строк

Отредактированно inmerdorm (12.09.2014 17:25:00)

Неактивен

 

#20 13.09.2014 13:10:40

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: помогите написать слияние таблиц

inmerdorm написал:

извиняюсь, господа, долго отсутствовал.

deadka написал:

Нам хоть как удобно... вопрос не в нашем удобстве. У Вас запрос от vasya нормально отработал?

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

Не верю smile Покажите пример.


inmerdorm написал:

Технически, работает следующий запрос:

insert into t1 (A1, A2, A3)
select B1, B2, B3 from t2
where t2.B1 not in
(select A1 from t1)
group by B1

не будет ли это тормозить с большим количеством данных, как думаете?
имею в виду, t1 от 10-20 тыс, t2 от 100 строк

Зависит от версии (в старых были проблемы с in подзапросами) и как минимум нужен индекс на b1.
Эксперимент на тестовых данных нужного объема даст вам точный ответ.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson