SQL 语句插入

Posted

技术标签:

【中文标题】SQL 语句插入【英文标题】:SQL Statement Insert Into 【发布时间】:2018-04-05 01:54:32 【问题描述】:

无论我做什么,我都会得到以下任何帮助。

消息 116,第 16 级,状态 1,第 15 行 当子查询不使用 EXISTS 引入时,选择列表中只能指定一个表达式。

消息 109,第 15 级,状态 1,第 1 行 INSERT 语句中的列多于 VALUES 子句中指定的值。 VALUES 子句中的值数必须与 INSERT 语句中指定的列数匹配。

我的查询

[tableA].[PROJECTID],
[tableA].[STUDYID],
[tableA].[SUBJNO],
[tableA].[CASENUMBER],
[tableA].[CASESTATUS],
[tableA].[MODIFIEDBY]
)VALUES((
SELECT b.PROJECTID, 
((SELECT TOP 1 a.STUDYID FROM [PRODVIEW] a WHERE a.DYNAME = b.DYNAME and 
a.ProjID = b.PROJID)) as STUDYID, 
b.SUBJNO, 
(b.SUBJNO + '_' + b.SEQUENCE) as CaseNumber, 
'READY' as CASESTATUS, 
b.UPLOADEDBY 
FROM [dbo].[TableB] b WHERE VIEWED = 0 
AND b.UPLOADEDDATE >=  DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0)))

【问题讨论】:

【参考方案1】:

如果您想使用SELECT 作为INSERT 的数据源,请不要使用VALUES,它用于插入文字数据:

INSERT INTO yourTable ([PROJECTID], [STUDYID], [SUBJNO], [CASENUMBER], [CASESTATUS],
    [MODIFIEDBY])
SELECT
    b.PROJECTID, 
    (SELECT TOP 1 a.STUDYID FROM [PRODVIEW] a
     WHERE a.DYNAME = b.DYNAME and a.ProjID = b.PROJID),
    b.SUBJNO, 
    (b.SUBJNO + '_' + b.SEQUENCE),
    'READY',
    b.UPLOADEDBY
FROM [dbo].[TableB] b
WHERE
    VIEWED = 0 AND
    b.UPLOADEDDATE >=  DATEADD(day, DATEDIFF(day, 0, GETDATE()), 0);

可能有一种方法可以在不使用 select 子句中的相关子查询的情况下编写查询,例如通过加入。实际上,TOP 的子查询毫无意义,因为没有 ORDER BY 子句。

另外请注意,您不需要在 SELECT 语句中使用别名。事实上,它们将被忽略,因为INSERT 确定了目标列。

【讨论】:

@larry 这取决于你对worked这个词的定义。正如我所提到的,你最好在你的子查询中加入一个ORDER BY 子句。

以上是关于SQL 语句插入的主要内容,如果未能解决你的问题,请参考以下文章

oracle用sql 语句如何向表中插入时间?

使用sql语句插入随机时间

用一条sql语句实现:存在则啥都不干,不存在,则插入

sql 语句如何插入全年日期?

如何从 SQL *PLUS 中的批量插入中查找失败的插入语句

怎么样向数据库中插入SQL语句啊