SQL插入包含来自多个表的数据

时间:2009-10-19 11:40:17

标签: sql-server insert multi-table

我有四个表:Messages,MessageCategory,MessageStatus和MessageLevel。

MessageCategory,MessageStatus和MessageLevel都只有三个字段:Identity(主键),Code和Description。消息引用这三个字段并具有一些其他数据字段,包括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
);
但是,这不起作用。那么,让这个工作的诀窍是什么? (保持代码可读......)

不幸的是,我无法访问其他数据库。我可以测试它但是一旦看起来有效,它只是发送和祈祷它的工作......

2 个答案:

答案 0 :(得分:6)

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。请注意,IdentityOrder都是保留的T-SQL关键字,不应用于列名。另请注意,子查询不得返回多行以使其正常工作,以确保我已包含TOP 1语句。

接下来要注意的是列别名(AS Category等)并非绝对必要。他们的订单非常重要。为了便于阅读,我会将它们包括在内,特别是当SELECT列表变长时。

答案 1 :(得分:4)

如果是单个脚本,请将您的身份存储在变量中:

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);