在 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 的值,这就是你想要的。

我希望现在一切都清楚了