Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте.
Помогите пожалуйста написать скрипт.
Есть две таблицы, 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)
Неактивен
Здравствуйте.
Приведите небольшой тестовый набор данных для таблиц t1 и t2. И какой результат должен получиться в t1 после выполнения запроса.
Неактивен
to deadka
Так скучно, предлагаю сыграть в "угадай, что нужно автору". Я отгадаю с первой попытки
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;
Неактивен
Отличная попытка!
А мы знаем, что в primary key идёт дефолтное значение типа auto_increment?
И насчет повторений значений в B1... ТС пишет, что могут повторяться, тогда по какому критерию будет происходить вставка значение B2 и B3? Исключительно интересно было бы все же получить от ТС тестовый набор, как он себе его видит.
Неактивен
Свечку конечно не держал, потому воспользуемся бритвой оккама и будем ждать решения судьи
Неактивен
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 Алексей Сергеев
Неактивен
А какая строка должна быть вставлена, если t2 имеет вид
t2:
B1 B2 B3
Вася Иванов Сергеевич
Миша Петров Андреевич
Алексей Сергеев
Алексей Михайлович
Неактивен
Да-да, я именно об этом. Вопрос к ТС - у primary key, как я понял, стоит аттрибут auto_increment?
Неактивен
vasya написал:
А какая строка должна быть вставлена, если t2 имеет вид
t2:
B1 B2 B3
Вася Иванов Сергеевич
Миша Петров Андреевич
Алексей Сергеев
Алексей Михайлович
первая:
Алексей Сергеев
deadka написал:
Да-да, я именно об этом. Вопрос к ТС - у primary key, как я понял, стоит аттрибут auto_increment?
Могу да, могу нет )
Видимо, нужно установить.
Отредактированно inmerdorm (12.08.2014 22:50:41)
Неактивен
Если исходить из использования запроса от 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`;
Неактивен
to deadka
имхо, ты не прав - min от строки?
изначальный вариант будет работать правильно, так как случайным образом возьмет "первую" строку. В кавычках, так как это понятие некорректно, так же как и в исходной постановке задачи.
Неактивен
Что-то я глупость написал, вопрос не в строке, а в том, что такое использование групповых функций даст не первую строку из массива повторяющихся строк, а строку, сформированную из минимальных значений в массиве (например, один столбец из одной строки, второй из другой).
Неактивен
Ммм... Так-то оно так.
Но замечу, что твой запрос позволителен лишь в MySQL (тот же слон не пропустит такой запрос ) и не в режиме ONLY_FULL_GROUP_BY. Стоит ли учить плохому?
С min тоже по умолчанию будет ошибка, да, я ошибся.
Может по мотивам твой же статьи соберем AnsiSQL-совместимое решение?
Топикстартеру тогда вопрос: по какому критерию должен быть выбран Алексей Сергеев? У него минимальный id (primary key) или как?
Неактивен
deadka написал:
Топикстартеру тогда вопрос: по какому критерию должен быть выбран Алексей Сергеев? У него минимальный id (primary key) или как?
Не важно. Как вам удобнее. главное, чтобы не было повторяющихся значений в столбце a1
Отредактированно inmerdorm (12.08.2014 23:45:29)
Неактивен
Нам хоть как удобно... вопрос не в нашем удобстве. У Вас запрос от vasya нормально отработал?
Неактивен
deadka написал:
Может по мотивам твой же статьи соберем AnsiSQL-совместимое решение?
Для корректной постановки нужно менять исходные, например, auto_increment primary key во второй таблице.
to inmerdorm, посмотрите http://sqlinfo.ru/articles/info/18.html
Неактивен
inmerdorm написал:
главное, чтобы не было повторяющихся значений в столбце a1
Задайте ему уникальный ключ - это будет гарантия.
Неактивен
извиняюсь, господа, долго отсутствовал.
deadka написал:
Нам хоть как удобно... вопрос не в нашем удобстве. У Вас запрос от vasya нормально отработал?
нет, запрос работает некорректно - в таблицу импортируется лишь одна, первая строка, которая удовлетворяет условию неповтояремости значений.
остальные строки не импортируются.
Отредактированно inmerdorm (12.09.2014 15:48:14)
Неактивен
Технически, работает следующий запрос:
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)
Неактивен
inmerdorm написал:
извиняюсь, господа, долго отсутствовал.
deadka написал:
Нам хоть как удобно... вопрос не в нашем удобстве. У Вас запрос от vasya нормально отработал?
нет, запрос работает некорректно - в таблицу импортируется лишь одна, первая строка, которая удовлетворяет условию неповтояремости значений.
остальные строки не импортируются.
Не верю Покажите пример.
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.
Эксперимент на тестовых данных нужного объема даст вам точный ответ.
Неактивен