Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Можно ли в один INSERT запихнуть два SELECT ?  [new]
very_orange
Member

Откуда:
Сообщений: 10
Можно ли в один INSERT запихнуть два SELECT ну еще дабавить несколько данных?

Делаю БД Библиотека. У меня 3 таблицы ('книги', 'пользователи' и 'выдача книг').
-- 'книги' (ID книги, Название книги, ...)
-- 'пользователи' (ID_пользователя, Фамилия, И_О, ...)
-- 'выдача книг' (ID_пользователя, ID книги, дата выдачи, дата возврата, отметка о возврате)
В 'выдача книг' нужно добавить новую строку:

INSERT INTO Vidaca_rnig (ID_пользователя, ID_книги, дата выдачи, отметка о возврате)

SELECT ID_пользователя
FROM users
WHERE Фамилия = 'Иванов'

SELECT ID_книги
FROM books
WHERE Название_книги = 'Азбука'

VALUES ('2010-06-03',' нет')

Как правильнее реализовать подобное, если это конечно возможно?
4 июн 12, 12:28    [12660915]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
very_orange,

UNION ALL
4 июн 12, 12:34    [12660966]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
INSERT INTO Vidaca_rnig (ID_пользователя, ID_книги, дата выдачи, отметка о возврате)

SELECT ID_пользователя
FROM users
WHERE Фамилия = 'Иванов'

union all

SELECT ID_книги
FROM books
WHERE Название_книги = 'Азбука'

union all

select '2010-06-03',' нет'
4 июн 12, 12:35    [12660974]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
INSERT INTO Vidaca_rnig (ID_пользователя, ID_книги, дата выдачи, отметка о возврате)
select 
(SELECT top 1 ID_пользователя
FROM users
 WHERE Фамилия = 'Иванов'
) as [ID_пользователя]
,
(
SELECT top 1 ID_книги
FROM books
 WHERE Название_книги = 'Азбука'
) as [ID_книги]
, '2010-06-03',' нет'
4 июн 12, 12:35    [12660978]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
very_orange
Member

Откуда:
Сообщений: 10
Спасибо большое, попробую реализовать.
4 июн 12, 12:38    [12660998]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
В момент выполнения инсерта айдишники должны быть известны, очевидно с клиента. Оператор же как-то выбирает данные на форме (экране и т.п.). Выбирается конкретная книга. У нее должен быть однозначный, уникальный айди.

Постановка вопроса некорректная.
4 июн 12, 12:52    [12661109]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
very_orange
Member

Откуда:
Сообщений: 10
Программист-Любитель
В момент выполнения инсерта айдишники должны быть известны, очевидно с клиента. Оператор же как-то выбирает данные на форме (экране и т.п.). Выбирается конкретная книга. У нее должен быть однозначный, уникальный айди.

Постановка вопроса некорректная.


так айдишки выбираются по определенной фамилии, из табл поль-ли, дело в том что тот кто будет пользоваться БД будет вводить фамилию, а не ID; ну если такая фамилия не одна, то еще и И_О и проч.
так же и с айдишкой для книги
4 июн 12, 12:58    [12661153]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
very_orange
Member

Откуда:
Сообщений: 10
invm
INSERT INTO Vidaca_rnig (ID_пользователя, ID_книги, дата выдачи, отметка о возврате)

SELECT ID_пользователя
FROM users
WHERE Фамилия = 'Иванов'

union all

SELECT ID_книги
FROM books
WHERE Название_книги = 'Азбука'

union all

select '2010-06-03',' нет'


Ошибка - > "Все запросы, объединенные с помощью операторов UNION, INTERSECT или EXCEPT, должны иметь одинаковое число выражений в целевых списках."
4 июн 12, 13:01    [12661179]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
very_orange
Программист-Любитель
В момент выполнения инсерта айдишники должны быть известны, очевидно с клиента. Оператор же как-то выбирает данные на форме (экране и т.п.). Выбирается конкретная книга. У нее должен быть однозначный, уникальный айди.

Постановка вопроса некорректная.


так айдишки выбираются по определенной фамилии, из табл поль-ли, дело в том что тот кто будет пользоваться БД будет вводить фамилию, а не ID; ну если такая фамилия не одна, то еще и И_О и проч.
так же и с айдишкой для книги

Именно о б этом я и говорил. В таблице пользователей каждая запись не может не иметь айди, так же как и в таблице книг. Ваша программа не должна была их потерять от момента выбора до момента ввода.

Если вы сделали таблицы без ПК автосчетчиков, то вы поступили неправильно. Естественые ключи маздай.
4 июн 12, 13:05    [12661207]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
very_orange
Member

Откуда:
Сообщений: 10
invm,


INSERT INTO Issuance_Return ([ID пользователя], [ID книги], [дата выдачи], [Отметка о возврате])


SELECT TOP 1 [ID пользователя]
FROM Users
WHERE [Фамилия пользователя] = 'Васильев'

union all

SELECT TOP 1 [ID книги]
FROM Books
WHERE [Название книги] = 'Евгений Онегин'

union all

select TOP 1 '2010-06-03' AS [дата выдачи]

union all

select TOP 1 'нет' AS [Отметка о возврате]

А так тоже получается ошибка - > 'Список выбора для инструкции INSERT содержит меньшее число элементов, чем список вставки. Число значений SELECT должно соответствовать числу столбцов INSERT.'
4 июн 12, 13:05    [12661208]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
very_orange
А так тоже получается ошибка ...
Не изобретайте свой собственный синтаксис запросов. Прочтите документацию.
4 июн 12, 13:07    [12661220]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
very_orange
Member

Откуда:
Сообщений: 10
Knyazev Alexey
INSERT INTO Vidaca_rnig (ID_пользователя, ID_книги, дата выдачи, отметка о возврате)
select 
(SELECT top 1 ID_пользователя
FROM users
 WHERE Фамилия = 'Иванов'
) as [ID_пользователя]
,
(
SELECT top 1 ID_книги
FROM books
 WHERE Название_книги = 'Азбука'
) as [ID_книги]
, '2010-06-03',' нет'


Символьные или двоичные данные могут быть усечены.
Выполнение данной инструкции было прервано. (
4 июн 12, 13:08    [12661229]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
very_orange
invm,
А так тоже получается ошибка - > 'Список выбора для инструкции INSERT содержит меньшее число элементов, чем список вставки. Число значений SELECT должно соответствовать числу столбцов INSERT.'


юнион тут не поможет...вы мой вариант уже посмотрели!?
4 июн 12, 13:08    [12661233]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
нуб987
Guest
very_orange, вы хотите вставить запись с перечисленными в insert() полями. Для этого нужно чтобы и в селекте были значения в том же порядке.
Вам правильно ответил Knyazev Alexey в этом сообщении.
Только возможно дату придется преобразовать, т.к. региональные настройки на серверах разные и именно этот формат может не принять.
Если не получится в том виде, попробуйте написать '20100603' (т.е. 'годмесяцдень' слитно без разделителей)
4 июн 12, 13:10    [12661245]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
very_orange
Member

Откуда:
Сообщений: 10
нуб987
very_orange, вы хотите вставить запись с перечисленными в insert() полями. Для этого нужно чтобы и в селекте были значения в том же порядке.
Вам правильно ответил Knyazev Alexey в этом сообщении.
Только возможно дату придется преобразовать, т.к. региональные настройки на серверах разные и именно этот формат может не принять.
Если не получится в том виде, попробуйте написать '20100603' (т.е. 'годмесяцдень' слитно без разделителей)


мне и подумалось, что должно быть этот вариант будет вернее, однако же даже после изменения написания даты (уже без '-'), все равно та же ошибка - > 'Символьные или двоичные данные могут быть усечены.
Выполнение данной инструкции было прервано.'
4 июн 12, 13:15    [12661268]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
very_orange
Member

Откуда:
Сообщений: 10
Получилось!! Господа, огромное спасибо!!
Глупейшая ошибка в написании ' нет', у меня пробел перед 'нет' стоял.
4 июн 12, 13:20    [12661302]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
нуб987
Guest
very_orange
'Символьные или двоичные данные могут быть усечены.
Выполнение данной инструкции было прервано.'

very_orange
Получилось!! Господа, огромное спасибо!!
Глупейшая ошибка в написании ' нет', у меня пробел перед 'нет' стоял.

проверьте ограничение на длину значения в этом поле? Наверно вы в этом текстовом поле сделали ограничение в 3 символа? Тогда да, значение " нет" (4 символа) будет усечено
4 июн 12, 13:35    [12661434]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
very_orange
Member

Откуда:
Сообщений: 10
нуб987,
да, да, именно было ограничение в 3 символа, теперь мне ясна моя ошибка )
Спасибо!
4 июн 12, 13:44    [12661507]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
very_orange
да, да, именно было ограничение в 3 символа, теперь мне ясна моя ошибка )

Ваша ошибка - потеря айди и их перевычисление по не уникальным полям. Вообще не с того конца решение.
4 июн 12, 13:45    [12661513]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
very_orange
Member

Откуда:
Сообщений: 10
Программист-Любитель,
Спасибо за помощь, постараюсь разобраться в данном вопросе.
4 июн 12, 14:00    [12661625]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли в один INSERT запихнуть два SELECT ?  [new]
Contrast
Member

Откуда: Москва
Сообщений: 190
very_orange
нуб987
very_orange, вы хотите вставить запись с перечисленными в insert() полями. Для этого нужно чтобы и в селекте были значения в том же порядке.
Вам правильно ответил Knyazev Alexey в этом сообщении.
Только возможно дату придется преобразовать, т.к. региональные настройки на серверах разные и именно этот формат может не принять.
Если не получится в том виде, попробуйте написать '20100603' (т.е. 'годмесяцдень' слитно без разделителей)


мне и подумалось, что должно быть этот вариант будет вернее, однако же даже после изменения написания даты (уже без '-'), все равно та же ошибка - > 'Символьные или двоичные данные могут быть усечены.
Выполнение данной инструкции было прервано.'


Подозреваю, что речь идет о попытке засунуть строку (" нет") в булево поле (bit или какой другой int)
4 июн 12, 14:07    [12661678]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить