Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
选择sql server的查询_Sql_Sql Server 2008 - Fatal编程技术网

选择sql server的查询

选择sql server的查询,sql,sql-server-2008,Sql,Sql Server 2008,我有一张产品表。 在我的表中有一个字段,如productid、price、quantity、total 而不是我如何将多个价格、数量字段和答案存储在total字段中。不要在表中存储派生值-这是一种糟糕的设计 既然total是价格和数量的乘积,当你有这些值时,你总是可以计算出来——为什么要存储它呢?如果这样做,您的数据库中可能会产生不一致的数据 直接从SQL检索这样的值非常简单,无需存储: SELECT price, quantity, price * quantity AS total FROM

我有一张产品表。 在我的表中有一个字段,如productid、price、quantity、total


而不是我如何将多个价格、数量字段和答案存储在total字段中。

不要在表中存储派生值-这是一种糟糕的设计

既然total是价格和数量的乘积,当你有这些值时,你总是可以计算出来——为什么要存储它呢?如果这样做,您的数据库中可能会产生不一致的数据

直接从SQL检索这样的值非常简单,无需存储:

SELECT price, quantity, price * quantity AS total
FROM product

更新:

正如@Martin所指出的,SQLServer2005+具有非持久化或索引列,为方便起见,这些列返回计算结果


我强调这些列不是持久化的。

您可以为此创建一个计算列

ALTER TABLE Products ADD total AS price * quantity
使用上面的定义,列既不会被持久化,也不会被索引,因此它只是方便您的查询

如果查询需要在搜索谓词中使用<代码>总计<代码>,则可以考虑对这样一个计算列进行索引。SQL Server会自动维护任何此类持久值,从而避免数据异常的潜在问题


此外,如果您正在执行此类查询,那么即使没有索引此类列,您的查询也可以从中受益。

完全取决于OP的查询内容。如果他们想要按
total
订购的
前10名
产品,这里的计算列将非常有用。computed column几乎否定了您所有反对的论点,因为它们确保不存在不一致数据的可能性,并且它们不必被持久化。@Martin-所以您同意不应该持久化
总计
列。我根本没有这么说。这取决于OP的查询是什么。如果他们想运行诸如“查找所有
total>10000
的产品”之类的查询,那么可以对其进行索引。