【问题标题】:SQL Statement Insert IntoSQL 语句插入
【发布时间】: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)))

【问题讨论】:

    标签: sql sql-server-2008 select-into


    【解决方案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 子句。
    猜你喜欢
    • 2015-04-03
    • 2023-03-17
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    相关资源
    最近更新 更多