Вставка SQL с данными из нескольких таблиц
-
22-09-2019 - |
Вопрос
У меня есть четыре столика:Сообщения, категория сообщений, MessageStatus и MessageLevel.
MessageCategory, MessageStatus и MessageLevel содержат всего три поля:Идентификатор (первичный ключ), Код и Описание.Сообщения относятся к этим трем полям и содержат несколько других полей данных, включая Идентификатор (первичный ключ) MessageText и Order.Поля идентификации являются полями с автоматическим увеличением.
Теперь мне нужно написать SQL-скрипт, чтобы добавить некоторые данные по умолчанию во все четыре таблицы.Проблема в том, что мне нужно создать скрипт, который будет отправлен клиенту, который затем выполнит этот скрипт.Я не могу написать немного более интеллектуальный код, чтобы выполнить полное обновление.И хотя три таблицы - это всего лишь простые инструкции insert, именно таблица Messages вызывает у меня дополнительную головную боль.
Я не могу удалить какие-либо индексы, и я не могу предположить, что он начинает отсчет с 1 для первичных ключей.
Итак, в качестве примера, у нее есть некоторые данные:
INSERT INTO MessageCategory (Code) Values ('Cat01');
INSERT INTO MessageStatus (Code) Values ('Status01');
INSERT INTO MessageLevel (Code) Values ('Level01');
И сообщения должны были бы содержать что-то вроде этого:
INSERT INTO Messages(Category, Status, Level, MessageText, Order)
VALUES(
(SELECT Identity from MessageCategory where Code='Cat01'),
(SELECT Identity from MessageStatus where Code='Status01'),
(SELECT Identity from MessageLevel where Code='Level01'),
'Just some message',
1
);
Однако это не сработает.Итак, в чем хитрость, чтобы это сработало?(Сохраняя код читабельным тоже ...)
К сожалению, у меня нет доступа к другой базе данных.Я могу протестировать это, но как только кажется, что это сработает, остается только отправить и молиться, чтобы это сработало...
Решение
INSERT INTO Messages
(Category, Status, Level, MessageText, [Order])
SELECT
(SELECT TOP 1 [Identity] from MessageCategory where Code='Cat01') AS Category,
(SELECT TOP 1 [Identity] from MessageStatus where Code='Status01') AS Status,
(SELECT TOP 1 [Identity] from MessageLevel where Code='Level01') AS Level,
(SELECT 'Just some message') AS MessageText,
(SELECT 1) AS [Order]
Вышесказанное будет работать для SQL Server.Обратите внимание, что оба Identity
и Order
являются зарезервированными ключевыми словами T-SQL и не должны использоваться для имен столбцов.Также обратите внимание, что подзапросы не должны возвращать более одной строки, чтобы это сработало, чтобы гарантировать, что я включил TOP 1
заявления.
Следующее, на что следует обратить внимание , это то , что псевдонимы столбцов (AS Category
и т.д.) не являются строго необходимыми.Их порядок - вот что имеет значение.Я бы включил их для удобства чтения, особенно когда список ВЫБОРА становится длиннее.
Другие советы
Если это один скрипт, сохраните ваши идентификаторы в переменных:
declare MessageCategoryID int;
declare MessageStatusID int;
declare MessageLevel int;
INSERT INTO MessageCategory (Code) Values ('Cat01');
set @MessageCategoryID=scope_identity();
INSERT INTO MessageStatus (Code) Values ('Status01');
set @MessageStatudID=scope_identity();
INSERT INTO MessageLevel (Code) Values ('Level01');
set @MessageLevelID=scope_identity();
INSERT INTO Messages(Category, Status, Level, MessageText, Order)
VALUES(
@MessageCAtegoryID,
@MessageStatusID,
@MessageLevelID,
'Just some message',
1);