0

私は明白な何かを見逃しているに違いありませんが、なぜ次のことをしますか

SELECT     c.ContractID, max( cs.ContractStatusCreated)
FROM       dbo.NMPT_Contract AS c INNER JOIN
           dbo.NMPT_ContractStatus AS cs ON c.ContractID = cs.ContractID INNER JOIN
           dbo.CMSS_Status AS s ON cs.StatusID = s.StatusID
group by  c.ContractID
having cs.ContractStatusCreated = MAX(cs.ContractStatusCreated)

SQL Server 2000から次を返しますか?

メッセージ8121、レベル16、状態1、行1の列'cs.ContractStatusCreated'は、集計関数またはGROUP BY句のいずれにも含まれていないため、HAVING句では無効です。

MAX集計関数ではありませんか?

4

3 に答える 3

1

エラー:

メッセージ 8121、レベル 16、状態 1、行 1 列 'cs.ContractStatusCreated' は、集計関数にも GROUP BY 句にも含まれていないため、HAVING 句では無効です。

MAX は集計関数

ただし、ContractStatusCreated は Group By にはありません

于 2012-07-12T14:53:07.950 に答える
1

group-by 句に含まれていないためcs.ContractStatusCreated、データの取得元がわかりません。

さらに良いことに、それによってグループ化すると、HAVING 1=1条件が発生し、max(cs.ContractStatusCreated)やりたいことを実行できなくなります。比較する最大値を見つけるには、自己結合またはサブクエリが必要だと思います。

于 2012-07-12T14:53:09.637 に答える
0

これをチェックしていませんが、「最大」を次のようなサブクエリに書き込むことができます。

select     ContractID, ContractStatusCreated
FROM       dbo.NMPT_Contract AS x INNER JOIN            
           dbo.NMPT_ContractStatus AS y ON x.ContractID = y.ContractID
where (x.ContractID, y.ContractStatusCreated) = (
    SELECT     c.ContractID, max( cs.ContractStatusCreated) 
    FROM       dbo.NMPT_Contract AS c INNER JOIN            
               dbo.NMPT_ContractStatus AS cs ON c.ContractID = cs.ContractID INNER JOIN            
               dbo.CMSS_Status AS s ON cs.StatusID = s.StatusID 
    group by  c.ContractID
)
于 2012-07-12T15:02:37.200 に答える