我有四个表:Messages、MessageCategory、MessageStatus 和 MessageLevel。
MessageCategory、MessageStatus 和 MessageLevel 都只有三个字段:Identity(主键)、Code 和 Description。 Messages 指的是这三个字段,并且还有一些其他的数据字段,包括 Identity(主键)MessageText 和 Order。身份字段是自动递增的字段。
我现在需要编写一个 SQL 脚本来为所有四个表添加一些默认数据。问题是,我需要创建一个脚本,该脚本将发送给客户,然后客户将执行此脚本。我无法编写更智能的代码来完成整个更新。虽然三个表只是简单的插入语句,但 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
等)并不是绝对必要的。他们的顺序才是最重要的。为了便于阅读,我会将它们包括在内,尤其是当 SELECT 列表变长时。
关于sql-server - 使用来自多个表的数据的 SQL 插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1588208/