【发布时间】:2016-10-25 19:44:39
【问题描述】:
我有三个处于一对多关系的表。由于我的业务场景不好解释,所以我将使用一个更熟悉的术语:
客户 -> 发票 -> 发票详情
假设存在 Customers.Value1、Invoices.Value2、InvoiceDetails.Value3,所有类型均为 double(实数)。
我需要获取包含来自特定国家/地区的客户的所有记录的 Value1、Value2 和 Value3 的摘要(实际上我的 where 子句有更多条件,但所有条件仅与客户表相关)。
我需要的值的 3 查询示例如下所示:
SELECT SUM(c.Value1) FROM Customers c WHERE c.Country = <cond>
SELECT SUM(i.Value2) FROM Customers c INNER JOIN Invoices i ON c.Id = i.CustomerId WHERE c.Country = <cond>
SELECT SUM(d.Value2) FROM (Customers c INNER JOIN Invoices i ON c.Id = i.CustomerId) INNER JOIN InvoiceDetails d ON i.Id = d.InvoiceId WHERE c.Country = <cond>
现在想象一下,如果我的 WHERE 子句非常复杂,那么重复这个 WHERE 子句 3 次看起来很糟糕并且容易出错。另外,在这个例子中,我们以相同的方式过滤记录 3 次
有没有办法避免重复 WHERE 子句,并在单个查询中执行此操作?
编辑:根据建议在连接查询中执行所有三个摘要的答案,让我提供数据来解释为什么这是不正确的。
Customers from Spain:
Customer1 Value1 = 10
Customer2 Value1 = 20
Invoices for customers from Spain:
Invoice1 Customer1 Value2 = 100
Invoice2 Customer1 Value2 = 200
Invoice3 Customer2 Value2 = 300
Invoice4 Customer2 Value2 = 400
SELECT SUM(c.Value1) FROM Customers c WHERE c.Country = "Spain"
returns 30
SELECT SUM(c.Value1), SUM(i.Value2) FROM Customers c INNER JOIN Invoices i ON c.Id = i.CustomerId WHERE c.Country = "Spain"
returns 60, 1000
如您所见,由于合并记录,客户摘要的结果不正确。
【问题讨论】:
-
为什么你不能做一个单一的
joined 查询并一次性总结它们?只需group by就可以了 -
@MarcB 好吧,如果我在第二个查询中添加了 SUM(c.Value1),那么由于连接查询中的重复值,Value1 的摘要将不正确
-
这是 EF,对吧?为什么不使用导航属性,让 EF 为您创建 SQL 查询?
-
@IvanStoev 你能举个例子吗?
-
c.Value1、i.Value2和d.Value2-int、decimal的类型是什么?
标签: sql-server entity-framework sql-server-2012 entity-framework-6