sql server 子查询连接错误

Posted

技术标签:

【中文标题】sql server 子查询连接错误【英文标题】:sql server subquery join error 【发布时间】:2014-01-03 02:31:18 【问题描述】:

我想更新 massemail_emailmaster 的 GroupID 列并将其设置为存储在 massemail_groupmaster 上的值。这两个表都有我用来加入子查询的 GroupName 列。 但是以下查询给了我错误。错误消息是 a3 附近的语法不正确。我不明白这里的语法错误。请帮忙。

UPDATE [dbo].[massmail_emailmaster]  a3
set a3.GroupId =
      (select TOP 1 a1.GroupID from [dbo].[massmail_groupmaster] a1 
         join [dbo].[massmail_emailmaster] a2
      on a1.[groupname] = a2.[groupname]
where a3.[GroupName]=a2.[GroupName]) 

[dbo]. [massmail_emailmaster]的DDL

(ClientID, varchar(50)),
           (uid, int)
           (Name, varchar(100))
           (GroupName, varchar(100))
           (Email, varchar(100))
           GroupId, int)

表的DDL

[dbo]. [massmail_groupmaster]
 (Clientid, varchar(50))
           ,(uid, int)
           ,(groupname, varchar(100))
(GroupId,int))

【问题讨论】:

您能否为您的表提供 DDL 或更好的 SQLFiddle? 连接是否应该在集合语法之前? @Mureinik 我添加了两个表的列详细信息。 @KayNelson 你能详细说明你的建议吗?我对这个查询真的很困惑。 【参考方案1】:
UPDATE  a2
SET a2.GroupId = (SELECT TOP 1 a.GroupID 
                   FROM [dbo].[massmail_groupmaster] a 
                   INNER JOIN [dbo].[massmail_emailmaster] b
                   ON a.[groupname] = b.[groupname]
                  ) 
FROM  [dbo].[massmail_emailmaster] a2
WHERE a.[groupname] = a2.[groupname]

【讨论】:

此更改消除了错误。只需对内部子查询进行一项更改,即可使其完美运行。我在最后的子查询中添加了 where 语句“where a.[groupname]=a1.[groupname]”。否则它会将所有 groupID 设置为相同的值。非常感谢人!你的建议真的很有帮助。【参考方案2】:

稍后在from 子句中定义别​​名时,您可以在update 中使用别名。 (这是一种“反常”情况,别名是在第一次使用之后定义的。)

UPDATE a3
    set GroupId = (select TOP 1 a1.GroupID
                   from [dbo].[massmail_groupmaster] a1
                   where a1.[groupname] = a3.[groupname]
                  )
    FROM [dbo].[massmail_emailmaster] a3;

【讨论】:

以上是关于sql server 子查询连接错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个使用字符串连接的查询会在 SQL Server Compact Edition 中引发错误?

SQL 从带有子查询的多个表中选择数据(包括来自内部连接的数据)错误:1242

通过 MS Access 例程更新 SQL Server(内部连接错误)

为啥sqlserver查询不到数据

SQL Server 查询因 RODBC 连接而失败,在 SQL Server 中工作

连接sql server2005时提示:内部连接致命错误。