2

我有 3 个表 master,element,check。

掌握

master_id,           
master_name,

元素

element_id,                                
element_name,                                

查看

(master_id)
(element_id)
check_id
check_name
description 

我想将值插入表中,check例如从表和表中。check_id,check_name,descriptionmaster_idmasterelement_idelement

我尝试了以下查询。

insert 
into CHECK values((select e.ELEMENT_ID,m.MASTER_ID from MASTER as m,ELEMENT as e where m.MASTER_ID=3 and ELEMENT_ID=3),'M001','chkitem1','Check description',)

它向我抛出以下错误。

Msg 116, Level 16, State 1, Line 1
当子查询没有用 EXISTS 引入时,只能在选择列表中指定一个表达式。

消息 213,级别 16,状态 1,行 1
列名称或提供的值的数量与表定义不匹配。

任何人都可以为此提供一个想法..?

4

1 回答 1

4

你可以有类似的东西

INSERT INTO dbo.Yourtable(list of columns)
VALUES (list of scalar, atomic values)

但随后您需要提供原子的标量值 - 文字或变量。

或者你使用这个语法

INSERT INTO dbo.YourTable(list of columns)
  SELECT (list of columns) 
  FROM dbo.YOurSourceTable ......

但在这种情况下,您没有指定VALUES关键字。

因此,在您的情况下,请尝试:

INSERT INTO dbo.CHECK(master_id, element_id, check_id, check_name, description)
  SELECT 
      e.ELEMENT_ID, m.MASTER_ID, 'M001', 'chkitem1', 'Check description'
  FROM 
      dbo.MASTER AS m
  INNER JOIN
      dbo.ELEMENT AS e ON m.MASTER_ID = e.ELEMENT_ID
  WHERE
       m.Master_ID = 3

FROM另外:不要使用仅用逗号分隔子句中的表列表的旧式 JOIN - 20 多年前,SQL-92标准已弃用这种方式!将适当的 ANSI JOIN 与INNER JOINor一起LEFT OUTER JOIN使用。

更新:好的,所以你似乎首先在表中插入了一些东西Master(你的问题并不清楚),然后你想SCOPE_IDENTITY在随后的插入中使用它 - 试试这个:

INSERT INTO dbo.Master(list-of-columns) VALUES(.........)

DECLARE @MasterID INT
SELECT @MasterID = SCOPE_IDENTITY()

INSERT INTO dbo.CHECK(master_id, element_id, check_id, check_name, description)
  SELECT 
      e.ELEMENT_ID, @MasterID, 'M001', 'chkitem1', 'Check description'
  FROM 
      dbo.MASTER AS m
  INNER JOIN
      dbo.ELEMENT AS e ON m.MASTER_ID = e.ELEMENT_ID
  WHERE
       m.Master_ID = @MasterID
于 2013-09-19T05:05:32.723 回答