在 SQL 服务器中处理 max() 函数时遇到问题
Trouble dealing with max() function in SQL Server
整个代码是存储过程的一部分。我有两段代码:
SELECT *
FROM eng
FULL JOIN ent ON eng.EntId = ent.EntId
FULL JOIN del ON del.EngId = eng.EngId
FULL JOIN cli ON cli.CId = ent.CId
WHERE eng.[Version] = (SELECT MAX([Version])
FROM eng b
WHERE eng.EngId = b.EngId
AND EntId = @EntId
GROUP BY EngId)
AND ent.[Version] = (SELECT MAX([Version])
FROM ent e
WHERE ent.EntId = e.EntId
AND EntId = @EntId
GROUP BY EntId)
AND ent.EntId = @EntityId
这个很好用。在线
eng.[Version] = (SELECT MAX([Version]) FROM eng b ...
此特定代码正在生成输出:
No Column name
1
2
另一个:
SELECT *
FROM [dbo].[del] D WITH(NOLOCK)
FULL JOIN eng EG WITH(NOLOCK) ON EG.EngId = D.EngId
FULL JOIN [dbo].[ent] E WITH(NOLOCK) ON E.EntId = D.EntId
FULL JOIN [dbo].cli cli ON cli.CliId = E.CliId
WHERE D.[Version] = (SELECT MAX([Version])
FROM del d
WHERE D.DelId = d.DelId
AND EngId = @EngId
GROUP BY DelId)
AND EG.[Version] = (SELECT MAX([Version])
FROM eng eg
WHERE EG.EngId = eg.EngId
AND EngId = @EngId
GROUP BY EngId)
AND E.[Version] = (SELECT MAX([Version])
FROM ent e
WHERE E.EntId = e.EntId
AND EntId = @EntId
GROUP BY EntId)
AND D.EngId = @EngId
这无法正常工作。我得到一个错误:
Subquery returned more than 1 value
这条线
D.[Version] = (SELECT MAX([Version]) FROM del d...
它独立地产生这个输出:
No column name
2
1
列和 table 名称是虚拟的。有人可以帮忙吗?
编辑
示例数据
Eng
table
EngID EntID Entname Version
-------------------------------------
Mana1 333113 name1 1
Mana1 333113 name2 2
Del
table
DelID EntID EngID Delname Version
-------------------------------------------------
D110 333113 Mana1 delname1 1
D110 333113 Mana1 delname2 2
D111 333113 Mana1 delnewname 1
我需要从这 2 table 中提取数据。
这是我需要的输出:
EntID EngID DelID Entname Delname Version (from del table)
---------------------------------------------------------
333113 Mana1 D110 name2 delname2 2
333113 Mana1 D111 name2 delnewname 1
逻辑是从 eng table 中拉取最新版本并将它们映射到 del table 中的行,并在那里找到最新版本。
我认为你在下一行中有一个 typo
D.[Version] = (SELECT MAX([Version]) FROM del d WHERE D.DelId=d.DelId AND EngId = @EngId group by DelId)
上面写着WHERE D.DelId=d.DelId
您正在比较来自同一 table、
的同一列
所以两个查询都没有做同样的事情。
编辑
既然你不相信我,我就用你的样本数据做了一个DBFiddle
我有你的问题,returns 错误,
我有一个查询,我在哪里更改了上面所说的 where 子句 I,这有效。
EDTI 2
在您询问这是如何工作的评论中,我会尝试解释
您的主查询有一个名为 D
的别名
select * FROM [dbo].[del] D
在你的 where 子句中你有一个子查询,在那个子查询中你还有一个别名叫做 d
FROM del d WHERE D.DelId=d.DelId
放在一起:
select *
FROM [dbo].[del] D
FULL JOIN eng EG ON EG.EngId = D.EngId
WHERE D.[Version] = (SELECT MAX([Version])
FROM del d
WHERE D.DelId=d.DelId -- I think this is wrong
AND EngId = @EngId
group by DelId
)
因此,您可能期望数据库从子查询(别名 d)中获取 DelID,并将其与主查询(别名 D)中的 DelID 进行比较。
但事实并非如此,因为别名 D 和 d 相同,数据库不会在主查询中查找值,因为它在子查询中有一个 d
。
你也可以写 where 1=1
因此,group by 找到 2 个不同的行(使用您的示例数据),因此 returns 2 个 MAX 值,因此出现错误。
我所做的是给子查询另一个别名“D2”,这意味着数据库现在将比较 D.DelID 和 D2.DelID 的值,这就是你想要的。
我希望现在一切都清楚了
整个代码是存储过程的一部分。我有两段代码:
SELECT *
FROM eng
FULL JOIN ent ON eng.EntId = ent.EntId
FULL JOIN del ON del.EngId = eng.EngId
FULL JOIN cli ON cli.CId = ent.CId
WHERE eng.[Version] = (SELECT MAX([Version])
FROM eng b
WHERE eng.EngId = b.EngId
AND EntId = @EntId
GROUP BY EngId)
AND ent.[Version] = (SELECT MAX([Version])
FROM ent e
WHERE ent.EntId = e.EntId
AND EntId = @EntId
GROUP BY EntId)
AND ent.EntId = @EntityId
这个很好用。在线
eng.[Version] = (SELECT MAX([Version]) FROM eng b ...
此特定代码正在生成输出:
No Column name
1
2
另一个:
SELECT *
FROM [dbo].[del] D WITH(NOLOCK)
FULL JOIN eng EG WITH(NOLOCK) ON EG.EngId = D.EngId
FULL JOIN [dbo].[ent] E WITH(NOLOCK) ON E.EntId = D.EntId
FULL JOIN [dbo].cli cli ON cli.CliId = E.CliId
WHERE D.[Version] = (SELECT MAX([Version])
FROM del d
WHERE D.DelId = d.DelId
AND EngId = @EngId
GROUP BY DelId)
AND EG.[Version] = (SELECT MAX([Version])
FROM eng eg
WHERE EG.EngId = eg.EngId
AND EngId = @EngId
GROUP BY EngId)
AND E.[Version] = (SELECT MAX([Version])
FROM ent e
WHERE E.EntId = e.EntId
AND EntId = @EntId
GROUP BY EntId)
AND D.EngId = @EngId
这无法正常工作。我得到一个错误:
Subquery returned more than 1 value
这条线
D.[Version] = (SELECT MAX([Version]) FROM del d...
它独立地产生这个输出:
No column name
2
1
列和 table 名称是虚拟的。有人可以帮忙吗?
编辑
示例数据
Eng
table
EngID EntID Entname Version
-------------------------------------
Mana1 333113 name1 1
Mana1 333113 name2 2
Del
table
DelID EntID EngID Delname Version
-------------------------------------------------
D110 333113 Mana1 delname1 1
D110 333113 Mana1 delname2 2
D111 333113 Mana1 delnewname 1
我需要从这 2 table 中提取数据。
这是我需要的输出:
EntID EngID DelID Entname Delname Version (from del table)
---------------------------------------------------------
333113 Mana1 D110 name2 delname2 2
333113 Mana1 D111 name2 delnewname 1
逻辑是从 eng table 中拉取最新版本并将它们映射到 del table 中的行,并在那里找到最新版本。
我认为你在下一行中有一个 typo
D.[Version] = (SELECT MAX([Version]) FROM del d WHERE D.DelId=d.DelId AND EngId = @EngId group by DelId)
上面写着WHERE D.DelId=d.DelId
您正在比较来自同一 table、
的同一列
所以两个查询都没有做同样的事情。
编辑
既然你不相信我,我就用你的样本数据做了一个DBFiddle
我有你的问题,returns 错误,
我有一个查询,我在哪里更改了上面所说的 where 子句 I,这有效。
EDTI 2
在您询问这是如何工作的评论中,我会尝试解释
您的主查询有一个名为 D
select * FROM [dbo].[del] D
在你的 where 子句中你有一个子查询,在那个子查询中你还有一个别名叫做 d
FROM del d WHERE D.DelId=d.DelId
放在一起:
select *
FROM [dbo].[del] D
FULL JOIN eng EG ON EG.EngId = D.EngId
WHERE D.[Version] = (SELECT MAX([Version])
FROM del d
WHERE D.DelId=d.DelId -- I think this is wrong
AND EngId = @EngId
group by DelId
)
因此,您可能期望数据库从子查询(别名 d)中获取 DelID,并将其与主查询(别名 D)中的 DelID 进行比较。
但事实并非如此,因为别名 D 和 d 相同,数据库不会在主查询中查找值,因为它在子查询中有一个 d
。
你也可以写 where 1=1
因此,group by 找到 2 个不同的行(使用您的示例数据),因此 returns 2 个 MAX 值,因此出现错误。
我所做的是给子查询另一个别名“D2”,这意味着数据库现在将比较 D.DelID 和 D2.DelID 的值,这就是你想要的。
我希望现在一切都清楚了