SQL插入来自多个表中的数据
-
22-09-2019 - |
题
我有四个表:消息,MessageCategory,MessageStatus和MessageLevel
MessageCategory,MessageStatus和MessageLevel都只是具有三个字段:标识(主键),码和说明。消息指这三个领域,并有一些其他的数据字段,包括标识(主键)和MessageText中订购。标识字段是自动递增字段。
我现在需要写一个SQL脚本一些默认的数据添加到所有四个表。问题是,我需要建立一个将被发送给客户谁就会执行这个脚本的脚本。我不能写一点更智能的代码做整体更新。虽然三个表只是简单的插入语句,它是引起了我一些额外的头痛消息表。
我无法除去任何指数和我不能假设它在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列表变得更长。
其他提示
如果这是一个脚本,存储您的身份变量:
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);
不隶属于 StackOverflow