我面前有一个绝对莫名其妙的案子。我有两个数据库环境 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
该查询返回发票上具有非零余额的用户列表。环境 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 上运行良好,但看起来好像 GROUP BY 子句在环境 B 中被完全忽略了。
当我从 SELECT 和 HAVING 子句中注释掉时,查询按预期工作Sum(invoices.Amount)
,因此它肯定连接到我的invoices.Amount
字段。
我已经备份了 A 并将其恢复到 B,并且 SqlDelta(数据库的差异工具)显示数据库是相同的,所以它不是数据问题,它必须是配置问题 - 但我不知道在哪里看。
如果相关,两个环境都在 Windows Server 2003 上使用 SQL Server 2000。两个环境都安装在两个单独的服务器、单独的 SQL Server 实例和单独的 Windows Server 2003 实例上。
什么可能导致 SQL Server 不对该invoices.Amount
字段进行分组?