我有以下SQL语句,只需使用Sybase 15数据库中的最新软件包版本号更新#temp
临时表。
UPDATE t
SET versionId = l.latestVersion
FROM #temp t INNER JOIN (SELECT gp.packageId
, MAX(gp.versionId) latestVersion
FROM Group_Packages gp
WHERE gp.groupId IN (SELECT groupId
FROM User_Group
WHERE userXpId = 'someUser')
GROUP BY gp.packageId) l
ON t.packageId = l.packageId
对我来说(主要是Oracle和SQL Server的经验比Sybase更多)这个陈述没有什么不妥。但是,Sybase抛出异常:
You cannot use a derived table in the FROM clause of an UPDATE or DELETE statement.
现在,我不知道问题在这里。我认为这是因为使用了聚合/ GROUP BY。当然,我可以将子查询放在临时表中并加入它但我真的想知道“正确”的方法应该是什么以及到底出了什么问题。
非常感谢任何想法或指导。
答案 0 :(得分:3)
似乎SYBASE不支持UPDATE FROM类中的嵌套查询。 Similar problem
尝试使用它:
UPDATE #temp
SET versionId = (SELECT MAX(gp.versionId) latestVersion
FROM Group_Packages gp
WHERE gp.packageId=#temp.packageId
and
gp.groupId IN (SELECT groupId
FROM User_Group
WHERE userXpId = 'someUser')
)
如果l.latestVersion为NULL,该怎么办?你想要将#temp更新为null吗?如果没有,那么添加WHERE:
WHERE (SELECT MAX(gp.versionId)
....
) is not null
答案 1 :(得分:0)
#temp的表别名称为“t”,原始表名为“t”。
我的猜测是这就是问题所在。
我想你想从:
开始update #temp
答案 2 :(得分:0)
我想这是FROM
UPDATE
子句中Sybase(不允许派生表)的限制。也许你可以像这样重写:
UPDATE t
SET t.versionId = l.versionId
FROM #temp t
INNER JOIN
Group_Packages l
ON t.packageId = l.packageId
WHERE
l.groupId IN ( SELECT groupId
FROM User_Group
WHERE userXpId = 'someUser')
AND
l.versionId =
( SELECT MAX(gp.versionId)
FROM Group_Packages gp
WHERE gp.groupId IN ( SELECT groupId
FROM User_Group
WHERE userXpId = 'someUser')
AND gp.packageId = l.packageId
) ;