Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Запрос на копирование данных из столбца одной таблицы в столбец другой  (Прочитано 17419 раз)
0 Пользователей и 1 Гость смотрят эту тему.
iros
Новенький

ru
Offline Offline

« : 14-01-2011 10:06 » 

Помогите, пожалуйста, написать запрос!
Есть две таблицы, Table1, Table2.
В одной из них, например, 50 столбцов и 1000 записей. В том числе есть столбцы a1, b1, c1, но для ста записей c1 не заполнен. Отсутствующие данные имеются в другой таблице, Table2, состоящей из столбцов a2,b2,c2, в которых как раз есть данные с2 по тем 100 записям (по условию a1=a2 и b1=b2).
Как перенести значения из с2 в с1?

При таком запросе:

Код: (SQL)
UPDATE Table1
SET с1 = (SELECT с2 FROM Table2 WHERE Table1.a1=Table2.a2 AND Table1.b1=Table2.b2)

выдаёт ошибку
"Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression."

Как правильно написать запрос, чтобы каждому конкретному значению возвращалось только одно?


-----------------
И ещё один вопрос на другую тему:
подскажите, пожалуйста, как в SQL Server в поле типа datetime поменять только год, или только месяц, или прибавить несколько дней?


Спасибо!
« Последнее редактирование: 14-01-2011 21:25 от McZim » Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 14-01-2011 10:29 » 

Комбинация (a2, b2) должна быть уникальна в пределах таблицы?
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
iros
Новенький

ru
Offline Offline

« Ответ #2 : 14-01-2011 10:39 » 

Во второй таблице, из которой копируют, она точно уникальна.
В первой - должна быть тоже, но может и нет, т.к. могут быть ошибочные повторы.
В случае повторов, значит все записи первой таблице, где a1 и b1 равны значениям a2 и b2 второй таблицы, во всех этих записях проставить одно и тоже значение с2.

А каким запросом можно проверить уникальность?
Записан
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #3 : 14-01-2011 11:18 » 

Цитата
Во второй таблице, из которой копируют, она точно уникальна.
а вот и нет
если при таком подзапросе
Код:
SELECT с2 FROM Table2 where Table1.a1=Table2.a2 and Table1.b1=Table2.b2
ругается
Цитата
"Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression."
то там точно Комбинация (a2, b2) НЕ уникальна
Записан

I Have Nine Lives You Have One Only
THINK!
Dusk
Команда клуба

ru
Offline Offline
Пол: Мужской
Редкий, но веселый вид


« Ответ #4 : 14-01-2011 11:28 » 

Добавь в запрос DISTINCT:

Код:
SELECT DISTINCT с2 FROM Table2 where Table1.a1=Table2.a2 and Table1.b1=Table2.b2

уберет все повторяющиеся значения
« Последнее редактирование: 14-01-2011 11:30 от Dusk » Записан

Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших
Опыт - это то, что появляется сразу после того, как он был так необходим...
Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 14-01-2011 11:30 » 

А каким запросом можно проверить уникальность?

Код: (SQL)
SELECT a2, b2, COUNT(*)
FROM Table2
GROUP BY a2, b2
HAVING COUNT(*) > 1

Этот запрос выведет сочетания a2, b2 и количество повторений в случае, если пара встречается более одного раза.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 14-01-2011 11:32 » 

DISTINCT не спасет, если a2 и b2 повторяются, а c2 при этом разные.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Dusk
Команда клуба

ru
Offline Offline
Пол: Мужской
Редкий, но веселый вид


« Ответ #7 : 14-01-2011 11:39 » 

DISTINCT не спасет, если a2 и b2 повторяются, а c2 при этом разные.

на это в условии написано:

Во второй таблице, из которой копируют, она точно уникальна.

Уникальность должна быть как раз по полям a2 и b2, если нет автор поста должен придумать что делать с данными.
Если уникальность по полям точно есть, то для условия:

В первой - должна быть тоже, но может и нет, т.к. могут быть ошибочные повторы.
В случае повторов, значит все записи первой таблице, где a1 и b1 равны значениям a2 и b2 второй таблицы, во всех этих записях проставить одно и тоже значение с2.

должно помочь.

« Последнее редактирование: 14-01-2011 11:43 от Dusk » Записан

Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших
Опыт - это то, что появляется сразу после того, как он был так необходим...
Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 14-01-2011 11:48 » 

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

Я бы предпочел подстраховаться:

Код: (SQL)
SELECT TOP 1 с2 FROM Table2 WHERE Table1.a1=Table2.a2 AND Table1.b1=Table2.b2

Хотя это костыль. По-хорошему нужно вводить уникальный ключ (a2, b2).
« Последнее редактирование: 14-01-2011 23:21 от Dale » Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Dusk
Команда клуба

ru
Offline Offline
Пол: Мужской
Редкий, но веселый вид


« Ответ #9 : 14-01-2011 12:24 » 

Dale, согласен, это более надежное решение, но и тут будет косяк, если нет уникальности a2, b2...
Записан

Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших
Опыт - это то, что появляется сразу после того, как он был так необходим...
Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 14-01-2011 12:49 » 

Ну по крайней мере возьмется первое попавшееся значение c2. Лучше все равно ничего не придумаешь - если данные противоречивы, любое значение одинаково хорошо (или скорее плохо).
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
iros
Новенький

ru
Offline Offline

« Ответ #11 : 14-01-2011 15:12 » 

Аааа, ребят, спасибо огромное!
Вы оказались правы, действительно значения были не уникальны.
Просто в структуре таблицы уникальность сочетания полей не была задана, т.к. таблица временная, а в данных сделали ошибку при занесении.
Я-то подумала, что сам запрос не верен, может, отбирает всю кучу значений по селекту, и потом эту кучу пытается поместить в каждую строку с1... Оказывается, всё-таки нет )

Спасибо за помощь!
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 14-01-2011 23:19 » 

в данных сделали ошибку при занесении.

iros, в информатике есть простая аксиома: система, которая полагается на внимательность пользователей, обречена еще до момента рождения. Наивнее, чем надежда на внимательность пользователей, может быть только надежда на их совесть.

На будущее рекомендация: в подобных случаях обязательно делайте уникальный составной индекс по полям (a2, b2). Пользователи будут получать по сусалам от сервера прямо в момент неудачной попытки вставки записи-дубликата, а таблица будет заведомо чистой. Не придется потом выкручиваться.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines