C# SQLite查询with TOTAL()返回空行,在读取时抛出ConstraintException
我有一个使用TOTAL aggregate函数的SQL查询:C# SQLite查询with TOTAL()返回空行,在读取时抛出ConstraintException,c#,sqlite,null,aggregate-functions,C#,Sqlite,Null,Aggregate Functions,我有一个使用TOTAL aggregate函数的SQL查询: SELECT c.Id, c.Name, ... b.BatchNumber, TOTAL(d.OrderedAmount) as TotalOrderedAmount FROM OrderProducts a LEFT JOIN WarehouseProducts b ON a.WarehouseProductId = b.Id ... WHERE a.OrderId = @OrderId A
SELECT
c.Id,
c.Name,
...
b.BatchNumber,
TOTAL(d.OrderedAmount) as TotalOrderedAmount
FROM OrderProducts a
LEFT JOIN WarehouseProducts b ON a.WarehouseProductId = b.Id
...
WHERE a.OrderId = @OrderId
AND (e.Status = @OrderedStatus OR e.Status IS NULL)
为了清晰起见,删除了无关的行
即使找不到任何结果,该查询也至少返回一行,这导致我假设每一列都为DBNull。当我尝试将此查询的结果加载到DataTable中时,由于空值,我得到了ConstraintException
如果我将总计行替换为0作为TotalOrderedAmount,则返回的行数为0,并且一切正常
我尝试使用a.Id不为NULL的地方,但无论我尝试什么,似乎总是至少返回一行
如何修改此查询,以便在找不到任何产品时,即使使用聚合函数,返回的行数也为0?这就是SQL中聚合查询的工作方式。 政府对此表示: 如果SELECT语句是没有GROUP BY子句的聚合查询,则在整个数据集中对结果集中的每个聚合表达式求值一次。对于数据集的任意选定行,结果集中的每个非聚合表达式都计算一次。每个非聚合表达式使用相同的任意选定行。或者,如果数据集包含零行,则针对完全由空值组成的行计算每个非聚合表达式 通过对结果集中的聚合表达式和非聚合表达式求值而创建的结果集数据的单行构成了不带GROUP by子句的聚合查询的结果。没有GROUPBY子句的聚合查询始终只返回一行数据,即使输入数据为零行也是如此 要允许结果为空,必须从最外层的查询中删除聚合函数TOTAL。 若要在存在结果记录时仍获取此值,请使用子查询: 选择 c、 身份证, c、 名字, ... b、 批次号, 选择TOTALd.OrderedAmount 从表d 式中,d.x=c.y-或d与其他表格相关 总订购量 来自订单产品a 加入…-这里没有d 哪里
这就是SQL中聚合查询的工作方式。 政府对此表示: 如果SELECT语句是没有GROUP BY子句的聚合查询,则在整个数据集中对结果集中的每个聚合表达式求值一次。对于数据集的任意选定行,结果集中的每个非聚合表达式都计算一次。每个非聚合表达式使用相同的任意选定行。或者,如果数据集包含零行,则针对完全由空值组成的行计算每个非聚合表达式 通过对结果集中的聚合表达式和非聚合表达式求值而创建的结果集数据的单行构成了不带GROUP by子句的聚合查询的结果。没有GROUPBY子句的聚合查询始终只返回一行数据,即使输入数据为零行也是如此 要允许结果为空,必须从最外层的查询中删除聚合函数TOTAL。 若要在存在结果记录时仍获取此值,请使用子查询: 选择 c、 身份证, c、 名字, ... b、 批次号, 选择TOTALd.OrderedAmount 从表d 式中,d.x=c.y-或d与其他表格相关 总订购量 来自订单产品a 加入…-这里没有d 哪里
可能的解决方法是答案中的扩展方法,它允许您在没有约束的情况下加载DataTable。可能的解决方法是答案中的扩展方法,它允许您在没有约束的情况下加载DataTable。