Sybase は独自の拡張機能を実装しているようGROUP BY
です:
次の拡張機能により、Sybase は、group by を含むクエリの選択リストに含めたり省略したりできるものに対する制限を解除します。
ただし、拡張の結果は必ずしも直感的ではありません。
where 句または結合を含む複雑なクエリで Transact-SQL 拡張機能を使用すると、結果がさらに理解しにくくなる場合があります。
これはあなたの問題にどのように関係していますか?
ただし、Adaptive Server が
select
リスト内の余分なカラムを処理する方法とwhere
句は矛盾しているように見える場合があります。例えば:
select type, advance, avg(price)
from titles
where advance > 5000
group by type
type advance
------------- --------- --------
business 5,000.00 2.99
business 5,000.00 2.99
business 10,125.00 2.99
business 5,000.00 2.99
mod_cook 0.00 2.99
mod_cook 15,000.00 2.99
popular_comp 7,000.00 21.48
popular_comp 8,000.00 21.48
popular_comp NULL 21.48
psychology 7,000.00 14.30
psychology 2,275.00 14.30
psychology 6,000.00 14.30
psychology 2,000.00 14.30
psychology 4,000.00 14.30
trad_cook 7,000.00 17.97
trad_cook 4,000.00 17.97
trad_cook 8,000.00 17.97
(17 rows affected)
where
事前 (拡張) 列の結果を見ると、クエリが句を無視しているようにしか見えません。Adaptive Server は、句を満たすローのみを使用してベクトル集約を計算しwhere
ますが、リストに含まれる拡張カラムのすべてのローも表示しますselect
。結果からこれらの行をさらに制限するには、句を使用する必要があります。having
そのため、期待どおりの結果を得るために、Sybase は次のことを許可する必要があります。
SELECT SUM(t1.c1), * FROM test AS t1 , test AS t2
WHERE t2.c1 = 1
HAVING t2.c1 = 1
はWHERE
合計から結果を除外しますSUM
。HAVING
条件に一致しないレコードを非表示にします。
紛らわしいですね。
GROUP BY
代わりに、Sybase の拡張機能を必要としないようにクエリを作成した方がよいでしょう。