2

私の目の前には絶対に不可解なケースがあります。A と B の 2 つのデータベース環境があり、環境 B は A のバックアップから作成されています。かなり単純なクエリを実行しています。

SELECT
    customers.customerName           (* varchar(100), not null *)
    ,countries.countryName           (* varchar(100), not null *)
    ,Balance = Sum(invoices.Amount)  (*        money, not null *)
FROM invoices
INNER JOIN customers
    ON customers.customerID = invoices.customerID
INNER JOIN countries
    ON countries.countryID = customers.countryID
GROUP BY
    customers.customerName
    ,countries.countryName
HAVING
    Sum(invoices.Amount) <> 0
ORDER BY
    customers.customerName

このクエリは、請求書の残高がゼロ以外のユーザーのリストを返します。環境 A の結果は次のようになります。

customerName        countryName        Balance
------------        -----------        -------
A                   United States       20.0000
B                   United States       -5.0000
C                   Canada             199.9900
D                   Canada              -0.0100
E                   United States       55.5900

環境 B での結果は次のとおりです。

customerName        countryName        Balance
------------        -----------        -------
A                   United States       10.0000
A                   United States       -5.0000
A                   United States       -1.0000
A                   United States       17.0000
A                   United States       -1.0000
B                   United States       -1.0000
B                   United States       -4.0000
C                   Canada             100.9900
C                   Canada              99.9900
...

環境 A ではクエリは正常に機能しますが、環境 B では GROUP BY 句が完全に無視されているように見えます。

SELECT 句と HAVING 句からコメントアウトすると、クエリは期待どおりに機能するSum(invoices.Amount)ため、フィールドに確実に接続されinvoices.Amountます。

AをバックアップしてBに復元しました.SqlDelta(データベースの差分ツール)はデータベースが同一であることを示しているため、データの問題ではなく、構成の問題である必要があります-しかし、どこにあるのかわかりません見る。

関連する場合、両方の環境が Windows Server 2003 で SQL Server 2000 を使用しています。両方の環境は、2 つの別個のサーバー、SQL Server の別個のインスタンス、および Windows Server 2003 の別個のインスタンスにインストールされます。

invoices.AmountSQL サーバーがフィールドをグループ化しない原因は何ですか?

4

3 に答える 3

3

次のクエリを試して、問題をより簡単な形式で再現してみてください。

SELECT customerName, Count(*)
FROM customer
GROUP BY customerName
ORDER BY customerName

このクエリを試して、別の方法でグループ化する理由として、顧客名の末尾にスペースがある可能性を確認してください。

SELECT customerName, Count(*)
FROM
(
SELECT '|' + customerName + '|' as customerName
FROM customer
) as sub
GROUP BY customerName
ORDER BY customerName
于 2009-06-04T17:53:36.107 に答える
1

HAVING 句をコメントアウトし、SELECT 句に Sum(invoices.Amount) を残すとどうなりますか? つまり、sum() 関数が機能していることを確認できますか?

また、データベース照合順序 (またはデフォルトのサーバー照合順序) を確認することもできます。照合設定は一部の集計関数に影響を与える可能性がありますが、確かに、それが sum() の結果を変更する理由はわかりません。

于 2009-06-04T18:05:47.537 に答える