Передо мной совершенно непонятный случай. У меня есть две среды баз данных, A и B, где среда 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
Запрос возвращает список пользователей с ненулевым балансом в счете. Результаты из среды А выглядят следующим образом:
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, но похоже, что предложение GROUP BY полностью игнорируется в среде B.
Запрос работает, как и ожидалось, когда я закомментирую Sum(invoices.Amount)
из предложения SELECT и HAVING, поэтому он определенно связан с моим полем invoices.Amount
.
Я создал резервную копию A и восстановил ее в B, и SqlDelta (инструмент сравнения для баз данных) показывает, что базы данных идентичны, поэтому это не проблема с данными, это должна быть проблема конфигурации - но у меня Идея, где искать.
В случае необходимости обе среды используют SQL Server 2000 на Windows Server 2003. Обе среды устанавливаются на двух отдельных серверах, отдельных экземплярах SQL Server и отдельных экземплярах Windows Server 2003.
Что может заставить сервер SQL не группировать поле invoices.Amount
?