插入选择查询

时间:2013-09-19 05:01:51

标签: sql sql-server

我有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_id来自master表,element_id来自element表。< / p>

我尝试了以下查询。

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引入子查询时,只能在选择列表中指定一个表达式。

     

Msg 213,Level 16,State 1,Line 1
  列名或提供的值数与表定义不匹配。

任何人都可以为此提出想法吗?

1 个答案:

答案 0 :(得分: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 - 已经不推荐使用 SQL-92 标准,更多比20年前!请使用适当的ANSI JOIN代替INNER JOINLEFT OUTER JOIN

更新:确定,所以您似乎首先在Master表中插入了一些内容(从您的问题中未明确)然后您想要使用{{1}在随后的插入中 - 试试这个:

SCOPE_IDENTITY