#sql #sql-server #subquery #dml
#sql #sql-сервер #подзапрос #dml
Вопрос:
У меня есть Dashboard_Diagram
таблица:
CREATE TABLE Dashboard_Diagram
(
diagram_id TINYINT,
name VARCHAR(50)
)
INSERT INTO Dashboard_Diagram
SELECT 1, 'Radar'
UNION ALL
SELECT 2, 'Bar'
UNION ALL
SELECT 3, 'Pie'
У меня есть Dashboard_Configuration
таблица:
CREATE TABLE SomeTable
(
user_id UNIQUEIDENTIFIER,
diagram_id TINYINT
)
И @user_id
:
DECLARE @user_id UNIQUEIDENTIFIER = 'E4F77F2C-8AA1-493A-94A3-03EA212453D4'
Я хочу динамически вставлять строки в Dashboard_Configuration
, основываясь на строках Dashboard_Diagram
. Таким образом, статически это будет выглядеть так:
INSERT INTO Dashboard_Configuration
@userId, 1
. . .
Я пробовал:
INSERT INTO Dashboard_Configuration
@user_id, (SELECT diagram_id FROM Dashboard_Diagram)
Но это выдает ошибку, потому что подзапрос возвращает более одного значения:
Сообщение 512, уровень 16, состояние 1, строка 7
Подзапрос вернул более 1 значения. Это не разрешено, когда подзапрос следует =, !=, <, <= , >, >= или когда подзапрос используется как выражение.
Как я могу вставить в таблицу на основе динамического количества строк из другой таблицы?
Ответ №1:
Использование insert . . . select
:
INSERT INTO Dashboard_Configuration (User_id, name)
SELECT @user_id, name
FROM Dashboard_Diagram;
Обратите внимание, что здесь также явно перечислены столбцы. Имена могут быть неправильными (вы не указываете их в вопросе), но лучше всего перечислять столбцы.
Редактировать:
Существует конфликт типов выше. Вы действительно намерены это сделать?
INSERT INTO Dashboard_Configuration (User_id, diagram_id)
SELECT @user_id, dd.diagram_id
FROM Dashboard_Diagram dd;
Комментарии:
1. Если мы всегда вставляем все столбцы, почему это неявно плохая практика?
2. @AugustWilliams . . . Вещи ломаются, когда вы добавляете, перемещаете или меняете тип столбцов.
3. Ах, это имело бы смысл.