Форум программистов, компьютерный форум, киберфорум
Наши страницы
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Dock2005
0 / 0 / 0
Регистрация: 09.10.2015
Сообщений: 11
1

Update с подзапросом. Простейший запрос который ввёл в ступор

09.06.2016, 10:10. Просмотров 1066. Ответов 8
Метки нет (Все метки)

Приветствую Господа. Помогите по возможности с запросом.

Имеем 2 таблицы:
1 Таблица t1 поля - ID_LIB (int), id_name (int)
2 Таблица t2 поля - ID_LIB (int), id_name (int)

В таблице t1 все строчки заполнены, в таблице t2 все строчки столбца id_name имею значение null

Вопрос как заполнить все строчки колонки id_name таблицы t2. Если t1.ID_LIB = t2.ID_LIB.

SQL
1
2
3
4
UPDATE t2 SET id_name = (SELECT t1.id_name 
                         FROM t1
                         JOIN t2 ON t2.ID_LIB = t1.ID_LIB
                         WHERE t1.ID_LIB = t2.ID_LIB)
Мой запрос ругается:
"Сообщение 512, уровень 16, состояние 1, строка 1
Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения.
Выполнение данной инструкции было прервано."

Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2016, 10:10
Ответы с готовыми решениями:

SQL запрос с подзапросом!
Че то никак нипалучаиццца... есть таблица: Name | Point Ivan | 5 Ivan ...

Неполный запрос UPDATE
Здравствуйте, уважаемые! Столкнулся с проблемкой, сейчас попробую описать...

UPDATE -запрос, что писать в WHERE?
Что нужно в WHERE писать? UPDATE .. SET = &lt;Миколаїв, nchar(50),&gt; ,...

Функция, которая возвращает имя пользователя, который вызвал UPDATE/DELETE/INSERT
Не могу нагуглить. Нужна функция которая возвращает имя пользователя который...

Простейший запрос prepare("UPDATE - почему не работает
почему не работает простейший запрос - что я сделал неправильно $like = 5;...

8
Claster
91 / 56 / 12
Регистрация: 02.10.2008
Сообщений: 550
09.06.2016, 10:13 2
Ругается потому-что вложенный запрос у вас возвращает более одного значения при джойне. Попробуйте использовать TOP 1 в под запросе.

T-SQL
1
2
3
4
UPDATE t2 SET id_name = (SELECT top 1 t1.id_name 
                         FROM t1
                         JOIN t2 ON t2.ID_LIB = t1.ID_LIB
                         WHERE t1.ID_LIB = t2.ID_LIB)
Либо сделайте (это если в случае что distinct в вашей таблице гарантировано вернет уникальность)

T-SQL
1
2
3
4
5
6
7
8
WITH DataTable AS(
SELECT distinct id_name, ID_LIB from t1
)
 
UPDATE t2 SET id_name = (SELECT  t1.id_name 
                         FROM DataTable  t1
                         JOIN t2 ON t2.ID_LIB = t1.ID_LIB
                         WHERE t1.ID_LIB = t2.ID_LIB
и потом используйте этот WITH в подзапросе
0
Dock2005
0 / 0 / 0
Регистрация: 09.10.2015
Сообщений: 11
09.06.2016, 10:44  [ТС] 3
Claster
К сожалению данный запрос

SQL
1
2
3
4
5
6
7
8
WITH DataTable AS(
SELECT DISTINCT id_name, ID_LIB FROM t1
)
 
UPDATE t2 SET id_name = (SELECT  t1.id_name 
                         FROM DataTable  t1
                         JOIN t2 ON t2.ID_LIB = t1.ID_LIB
                         WHERE t1.ID_LIB = t2.ID_LIB
Возвращает такую же ошибку "Сообщение 512, уровень 16, состояние 1, строка 1
Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения.
Выполнение данной инструкции было прервано.
"
0
Claster
91 / 56 / 12
Регистрация: 02.10.2008
Сообщений: 550
09.06.2016, 10:46 4
Я писал
это если в случае что distinct в вашей таблице гарантировано вернет уникальность
значит у вас для одного ID_LIB много id_name. Определитесь какой вам именно надо
0
Dock2005
0 / 0 / 0
Регистрация: 09.10.2015
Сообщений: 11
09.06.2016, 10:58  [ТС] 5
Claster,

ID_LIB является уникальным значением в таблице и не повторяется.

Если мы сделаем запрос

SQL
1
SELECT * FROM t1 WHERE ID_LIB = '12345'
12345 = любое значение

мы получим только одно значение так как ID_LIB является Идентификатором назначаемым самим SQL
0
invm
1884 / 1276 / 380
Регистрация: 02.06.2013
Сообщений: 3,222
09.06.2016, 11:32 6
Цитата Сообщение от Dock2005 Посмотреть сообщение
мы получим только одно значение так как ID_LIB является Идентификатором назначаемым самим SQL
Это не есть гарантия уникальности. Гарантию дает уникальный индекс или первичный ключ.
0
Claster
91 / 56 / 12
Регистрация: 02.10.2008
Сообщений: 550
09.06.2016, 12:04 7
Dock2005,
Ну вам же SQL написал Вложенный запрос вернул больше одного значения значит у вас есть такие ID_LIB у которых больше одного id_name

Проверьте


T-SQL
1
2
3
4
SELECT count(id_name) Cr, ID_LIB 
FROM t1 
group by ID_LIB 
HAVING count(id_name) > 1
Что вернет запрос?
0
Dock2005
0 / 0 / 0
Регистрация: 09.10.2015
Сообщений: 11
09.06.2016, 12:57  [ТС] 8
Claster,

SQL
1
2
3
4
SELECT COUNT(id_name) Cr, ID_LIB 
FROM t1 
GROUP BY ID_LIB 
HAVING COUNT(id_name) > 1
"(строк обработано: 0)"

SQL
1
2
3
4
SELECT COUNT(id_name) Cr, ID_LIB 
FROM t2 
GROUP BY ID_LIB 
HAVING COUNT(id_name) > 1
"(строк обработано: 0)"



Выдают 0 значений в каждом из запросов - т.е. получается нет дублированных значений.
0
i-sm
43 / 43 / 11
Регистрация: 04.04.2012
Сообщений: 122
09.06.2016, 22:50 9
Dock2005, попробуйте так:

T-SQL
1
2
3
UPDATE t2 
SET id_name =t1.id_name
FROM t2 inner join t1 ON t2.ID_LIB = t1.ID_LIB
0
09.06.2016, 22:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2016, 22:50

Непонятное поведение потока ввода: в одной функции букву ввёл = во всех функциях наперёд ввёл. Распродажа!
Парни, у меня возникла щекотливая ситуация. Делаю маленькую программу...

Запрос с подзапросом
Нужно сделать запрос: &quot;Для каждого года выбрать тот месяц/месяцы, на который...

Запрос с подзапросом
В старой теме что то никто не подсказал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru