1

簡単なテーブルを用意しましょう:

CREATE TABLE dbo.test
(
    c1  INT
)

INSERT INTO test (c1) VALUES (1)
INSERT INTO test (c1) VALUES (2)
INSERT INTO test (c1) VALUES (3)

次に、SUM を計算します。

SELECT SUM(t1.c1) FROM test AS t1 , test AS t2
WHERE t2.c1 = 1

出力は次のとおりです。 6 。シンプルで簡単。

しかし、私が実行した場合:

SELECT SUM(t1.c1), * FROM test AS t1 , test AS t2
WHERE t2.c1 = 1

出力は次のとおりです。

6   2   2
6   2   3
6   2   1
6   3   2
6   3   3
6   3   1
6   1   2
6   1   3
6   1   1

私の質問は: 2 番目の出力が WHERE 句の条件と一致しないのはなぜですか?

4

1 に答える 1

6

Sybase は独自の拡張機能を実装しているようGROUP BYです:

次の拡張機能により、Sybase は、group by を含むクエリの選択リストに含めたり省略したりできるものに対する制限を解除します。

  • 選択リストの列は、グループ化列およびベクトル集計で使用される列に限定されません。

  • 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合計から結果を除外しますSUMHAVING条件に一致しないレコードを非表示にします。

紛らわしいですね。

GROUP BY代わりに、Sybase の拡張機能を必要としないようにクエリを作成した方がよいでしょう。

于 2013-03-05T18:32:21.720 に答える