我们可以在插入查询中使用具有多个列值的聚合函数吗?

时间:2014-09-02 04:31:01

标签: sql-server

我的查询是

insert into student 
values('pravin', 1990-08-06, 'hyderabad', select count(*) from student, 'male', 1990-5-3, 1989-4-6)

我收到了错误

  

第15行,第1行,第1行,第1行   关键字“select”附近的语法不正确。

     

Msg 102,Level 15,State 1,Line 1
  'male'附近的语法不正确。

insert into student 
values('pravin', 1990-08-06, select min(location) from student, 5645645646, 'male', 1990-5-3, 1989-4-6)

结果:

  

第15行,第1行,第1行,第1行   关键字“select”附近的语法不正确。

     

Msg 102,Level 15,State 1,Line 1
  '5645645646'附近的语法不正确。

表格结构 -

create table student
(
      StudentId int identity
      ,StudentName varchar(50)
      ,[Date Of Birth] datetime
      ,Location varchar(50)
      ,ContactNo varchar(50)
      ,Gender varchar(50)
      ,[Date Created] datetime
      ,[Date Modified] datetime
 )

示例插入声明 -

insert into student(StudentName,[Date Of Birth],Location,ContactNo,Gender,[Date Created],[Date Modified])
values('pravin',1990-08-06,'hyderabad',5645645646,'male',1990-5-3,1989-4-6)

insert into student(StudentName,[Date Of Birth],Location,ContactNo,Gender,[Date Created],[Date Modified]) 
values('John',1990-08-06,'chennai',5645645646,'male',1990-5-3,1989-4-6)

inse‌​rt into student(StudentName,[Date Of Birth],Location,ContactNo,Gender,[Date Created],[Date Modified]) 
values('Krish',1990-08-06,'banglore',5645645646,'male',1990-5-3,1989-4-6) 

1 个答案:

答案 0 :(得分:3)

INSERT命令有两种形式:

(1)您可以使用所有值,如文字或SQL Server变量 - 在这种情况下,您可以使用INSERT .. VALUES()方法:

INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN)
VALUES(Value1, Value2, @Variable3, @Variable4, ...., ValueN)

注意:我建议始终明确指定要插入数据的列列表 - 这样,如果您的表突然有一个额外的列,您将不会有任何令人讨厌的意外,或者如果您的表具有IDENTITY或计算列。是的 - 这是一项更多的工作 - 曾经 - 但是你的INSERT陈述尽可能坚实,你不必经常弄乱如果你的桌子发生变化,请用它。

(2)如果你将所有值都作为文字和/或变量,而是你想要依赖另一个表,多个表或视图,以提供值,然后您可以使用INSERT ... SELECT ...方法:

INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN)
   SELECT
       SourceColumn1, SourceColumn2, @Variable3, @Variable4, ...., SourceColumnN
   FROM
       dbo.YourProvidingTableOrView

在这里,您必须在SELECT中定义与INSERT所期望的完全相同的项目 - 这些项目可以是表格(或视图)中的列,或者那些可以是文字或变量。再次:明确提供要插入的列的列表 - 参见上文。

您可以使用其中一个 - 但无法混合两者 - 您无法使用VALUES(...)然后进行SELECT查询在你的价值列表中间 - 选择其中一个 - 坚持下去。

更新:

我尝试在SELECT声明中解释您无法VALUES()列表中间使用INSERT - 您将会这样做需要使用INSERT INTO ... SELECT ....样式,所以不要这样:

insert into student 
values('pravin', 1990-08-06, 'hyderabad', select count(*) from student, 'male', 1990-5-3, 1989-4-6)

你需要使用它:

INSERT INTO dbo.Student(provide-the-list-of-columns-here!)
   SELECT
      'pravin', '19900806', 'hyderabad', 
      COUNT(*) 
      'male', '19900503', '19890406'
  FROM 
      dbo.student

注意:

  • 始终提供您在INSERT声明中插入的列列表
  • 将您的日期改为单引号!
  • 另外,我建议始终使用ISO-8601格式 - YYYYMMDD - 这是一种无论您的语言和日期格式设置如何都可以使用的格式

更新#2:

您对此代码发表了评论:

insert into student(StudentName,[Date Of Birth],Location,ContactNo,Gender,[Date Created],[Date Modified]) 
values('pravin',1990-08-06,select max(location) from student,5645645646,'male',1990-5-3,1989-4-6) – 

再次:;你不能做这个!当然它不起作用 - 我一直试图告诉你的一切!

如果您想在SELECT MAX(Location) ....的中间使用INSERT必须使用INSERT INTO ... SELECT ...样式:

INSERT INTO dbo.student(StudentName, [Date Of Birth], Location, ContactNo, Gender, [Date Created], [Date Modified]) 
    SELECT
       'pravin', '19900806',
       MAX(location) 
       5645645646, 'male', '19900503', '19890406'
    FROM 
       dbo.student

再次:将所有您的日期放入单引号中,然后使用YYYYMMDD(无破折号!)格式。