| 
			| 
					
						| 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 Table1SET с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 OnlyTHINK!
 |  |  | 
	| 
			| 
					
						| 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
 
 Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
 |  |  | 
	|  |