【问题标题】:Insert statement with subquery which has inner join statement插入带有内连接语句的子查询的语句
【发布时间】:2019-06-01 00:12:09
【问题描述】:

我的 SQL Server 数据库中有 3 个表,名为 CollegeUniversityOldSyllabus

College有1000行,列如DateOfJoiningstudentName

University有50行,列如DateOfCourseRevisioncourseName

我需要编写一个插入语句,通过将UniversityDateOfCourseRevision 列与CollegeDateOfJoining 列进行比较来将记录推送到表OldSyllabus

通过比较DateOfCourseRevision <= DateOfJoiningCollege 表中的所有记录插入OldSyllabus

查询:

INSERT INTO [OS].[OldSyllabus] (StudenName, Address) 
VALUES 
    ((SELECT C.Name 
      FROM [COL].[College] AS c 
      INNER JOIN [UNI].[University] AS u ON c.CourseName = u.CourseName 
                                         AND c.Date <= u.Date),
     (SELECT C.Address  
      FROM [COL].[College] AS c 
      INNER JOIN [UNI].[University] AS u ON c.CourseName = u.CourseName 
                                         AND c.Date <= u.Date))

我收到一个错误:

子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

【问题讨论】:

  • 您尝试了哪些方法,哪些方法不起作用?另外,你的问题是什么?
  • 还有不明白的错误呢?与 SQL Server 中的其他一些错误相比,它是关于问题所在的更清晰和明确的错误之一。
  • 也许分享您的查询会对我们这些看不到您屏幕的人有所帮助?
  • 我感觉这是针对学校的,但是当您插入 StudentName 列并且值是 College 表中的名称时,似乎有些不对劲。另外,您的教授真的让您为每个表使用单独的架构吗?
  • 嗨,肖恩,我刚刚编写了一个快速示例查询,它与我的原始查询完全相似,只是在架构名称上有一些错误。但除了模式之外,我其余的代码都是我正在努力解决的问题

标签: sql sql-server


【解决方案1】:

但是,您在这里所做的是混合 INSERT ...VALUESINSERT...SELECT 语法。该文档提供了有关如何执行INSERT...SELECT statement: Inserting Data from Other Tables 的示例。您需要删除 SELECT 周围的括号 (()),并删除 VALUES 子句。所以:

INSERT INTO [OS].[OldSyllabus] (StudenName) --Should that be StudentName? 
SELECT C.Name
FROM [COL].[College] AS c
     INNER JOIN [UNI].[University] AS u ON c.CourseName = u.CourseName
                                       AND c.Date <= u.Date;

【讨论】:

  • 嗨 Larnu,感谢您的建议,我需要在插入记录时提及 ColumnName,因为我从其他表中提取了几列并插入到 OldSyllabus 表中,希望我回答了您的问题跨度>
  • 我没有问这个问题,@Avinesh,你问了。这是我对你的问题的回答。
  • 是的,它部分解决了,如果我想插入多列怎么办??在我的示例中,我提到了 StudentName。但是如果我想更新 studentName 和 StudentAddress ????怎么办???
  • 将额外的列添加到您的INSERTSELECT 语句@Avinesh。我建议阅读我链接的文档,因为您似乎不熟悉 SELECTINSERT 语句语法。您可能还想查看一些在线教程;因为SELECT 是任何 SQL 语言的基础之一。
  • SELECT Column1, Column2, Column3 SELECT Examples (Transact-SQL)
【解决方案2】:

假设表 oldsyllabus 表已经创建并且列与大学相同,使用下面的查询从大学表中获取数据并存储:

INSERT INTO `oldsyllabus`(`DateofJoining`, `studentName`) SELECT college.DateofJoining, college.studentName FROM college JOIN university WHERE university.dateOfCourseRevision <= college.DateofJoining;

如果尚未创建表或列,请转到: Create table (structure) from existing table 这里解释了如何从现有的表创建表

【讨论】:

  • OP 使用的是 SQL Server,而不是 MySQL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多