1. ホーム
  2. sql-server

[解決済み] 各GROUP BY式は、外部参照でない列を少なくとも1つ含む必要があります。

2022-02-03 11:02:17

質問

何が間違っているのでしょうか?このエラーが発生します。

SELECT LEFT(SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000), 
            PATINDEX('%[^0-9]%', SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', 
            batchinfo.datapath), 8000))-1),
            qvalues.name,
            qvalues.compound,
            qvalues.rid
FROM batchinfo JOIN qvalues ON batchinfo.rowid=qvalues.rowid
WHERE LEN(datapath)>4
GROUP BY 1,2,3
HAVING rid!=MAX(rid)

最大値を持つ1列目、2列目、3列目でグループ化したいのですが。

group byとhavingがなくても問題なく動作します。

解決方法は?

そもそも、こんなことはできない。

having rid!=MAX(rid)

HAVING節には、集約グループの属性であるものだけを含めることができます。

さらに 1, 2, 3 は、SQL Server の GROUP BY では無効です - ORDER BY でのみ有効だと思います。

なぜ、これと違うのか説明してもらえますか。

select 
LEFT(SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000), PATINDEX('%[^0-9]%', SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000))-1),
qvalues.name,
qvalues.compound,
MAX(qvalues.rid)
 from batchinfo join qvalues on batchinfo.rowid=qvalues.rowid
where LEN(datapath)>4
group by LEFT(SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000), PATINDEX('%[^0-9]%', SUBSTRING(batchinfo.datapath, PATINDEX('%[0-9][0-9][0-9]%', batchinfo.datapath), 8000))-1),
qvalues.name,
qvalues.compound