iros
Новенький
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? При таком запросе: 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
|
|
« Ответ #1 : 14-01-2011 10:29 » |
|
Комбинация (a2, b2) должна быть уникальна в пределах таблицы?
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
iros
Новенький
Offline
|
|
« Ответ #2 : 14-01-2011 10:39 » |
|
Во второй таблице, из которой копируют, она точно уникальна. В первой - должна быть тоже, но может и нет, т.к. могут быть ошибочные повторы. В случае повторов, значит все записи первой таблице, где a1 и b1 равны значениям a2 и b2 второй таблицы, во всех этих записях проставить одно и тоже значение с2.
А каким запросом можно проверить уникальность?
|
|
|
Записан
|
|
|
|
HandKot
Молодой специалист
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
Команда клуба
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
|
|
« Ответ #5 : 14-01-2011 11:30 » |
|
А каким запросом можно проверить уникальность? SELECT a2, b2, COUNT(*) FROM Table2 GROUP BY a2, b2 HAVING COUNT(*) > 1 Этот запрос выведет сочетания a2, b2 и количество повторений в случае, если пара встречается более одного раза.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Dale
|
|
« Ответ #6 : 14-01-2011 11:32 » |
|
DISTINCT не спасет, если a2 и b2 повторяются, а c2 при этом разные.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Dusk
Команда клуба
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
|
|
« Ответ #8 : 14-01-2011 11:48 » |
|
Я так понимаю, что фразу "уникальность должна быть, но может оказаться так, что ее и нет" на всякий случай лучше понимать как "целостность данных не обеспечена, поэтому на самом деле может быть все что угодно". Я бы предпочел подстраховаться: 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
Команда клуба
Offline
Пол:
Редкий, но веселый вид
|
|
« Ответ #9 : 14-01-2011 12:24 » |
|
Dale, согласен, это более надежное решение, но и тут будет косяк, если нет уникальности a2, b2...
|
|
|
Записан
|
Человек, сделавший хотя бы шаг к цели, сразу становится мишенью для всех отставших Опыт - это то, что появляется сразу после того, как он был так необходим... Бывают минуты, когда у тебя есть секунды, чтобы исправить деланное часами и не получить последствия на годы...
|
|
|
Dale
|
|
« Ответ #10 : 14-01-2011 12:49 » |
|
Ну по крайней мере возьмется первое попавшееся значение c2. Лучше все равно ничего не придумаешь - если данные противоречивы, любое значение одинаково хорошо (или скорее плохо).
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
iros
Новенький
Offline
|
|
« Ответ #11 : 14-01-2011 15:12 » |
|
Аааа, ребят, спасибо огромное! Вы оказались правы, действительно значения были не уникальны. Просто в структуре таблицы уникальность сочетания полей не была задана, т.к. таблица временная, а в данных сделали ошибку при занесении. Я-то подумала, что сам запрос не верен, может, отбирает всю кучу значений по селекту, и потом эту кучу пытается поместить в каждую строку с1... Оказывается, всё-таки нет )
Спасибо за помощь!
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #12 : 14-01-2011 23:19 » |
|
в данных сделали ошибку при занесении. iros, в информатике есть простая аксиома: система, которая полагается на внимательность пользователей, обречена еще до момента рождения. Наивнее, чем надежда на внимательность пользователей, может быть только надежда на их совесть. На будущее рекомендация: в подобных случаях обязательно делайте уникальный составной индекс по полям (a2, b2). Пользователи будут получать по сусалам от сервера прямо в момент неудачной попытки вставки записи-дубликата, а таблица будет заведомо чистой. Не придется потом выкручиваться.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
|