Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 Server_Performance_Tsql_Distinct - Fatal编程技术网

Sql server 获取重复数据真的是错误的查询还是错误的数据库设计?

Sql server 获取重复数据真的是错误的查询还是错误的数据库设计?,sql-server,performance,tsql,distinct,Sql Server,Performance,Tsql,Distinct,第二段说: “resultset有重复项这一事实通常(尽管并不总是)是由于数据库设计不佳、查询效率低下或两者兼而有之。” 稍后使用Adventures数据库作为示例,我想它的设计很好 我怀疑的是这个案子。我需要表格、人员和订单,我想得到所有至少有一份订单的人员,总金额>=200美元。我将使用以下查询: Select Persons.* from Persons, Orders where Orders.IDPerson = Persons.IDPerson and Orders.Total &g

第二段说:

“resultset有重复项这一事实通常(尽管并不总是)是由于数据库设计不佳、查询效率低下或两者兼而有之。”

稍后使用Adventures数据库作为示例,我想它的设计很好

我怀疑的是这个案子。我需要表格、人员和订单,我想得到所有至少有一份订单的人员,总金额>=200美元。我将使用以下查询:

Select Persons.* from Persons, Orders where
Orders.IDPerson = Persons.IDPerson
and Orders.Total >= 200;
select * from Person where
IDPerson IN(select IDPerson from Orders where total >= 200);
在这种情况下,我可以得到很多次相同的人,因为有一个以上的订单,总数是200或更多。我真的希望每个人都在结果中出现一次,那么这个查询是不是一个糟糕的查询,因为我可以多次得到同一个人

另一个选项是此查询:

Select Persons.* from Persons, Orders where
Orders.IDPerson = Persons.IDPerson
and Orders.Total >= 200;
select * from Person where
IDPerson IN(select IDPerson from Orders where total >= 200);
在这种情况下,每个人只能得到一次订单,尽管此人有多个订单,订单总数>=200。但是使用子查询来避免主查询中的重复,这是一个好主意吗

在这种情况下,个人和订单,我想数据库设计是不错的,因为我不知道我必须设计这个模型的其他选项,我猜查询非常简单,但我怀疑在这种情况下,获得重复数据是否是坏查询的标志

在sumary中,在这种情况下获取重复项是一个错误的查询吗


谢谢。

我认为第一个查询像这样不好。获取以后需要使用DISTINCT删除的副本似乎没有用

带子查询的秒查询在上下文中似乎更有用(有时使用“exists”而不是“in”更有意义)

也可以进行此类查询:

select * 
from Person
join
(
    select IDPerson
    from Orders 
    where total >= 200  
) PersonsWithMoreThan200Total
on Person.IDPerson = PersonsWithMoreThan200Total.IDPerson

不使用显式的
JOIN
:)AdventureWorks设计是错误的做法。第一个查询返回它应该返回的结果。但是你有
1:n
关系。这就是为什么你会得到复制品。如果您只需要
人员
数据,您可以添加
选择不同的人员。*
但是子查询的解决方案稍好一些。查询(1)不是无效的,而是错误的。你的英语问题是:所有至少有一份订单的人,订单总额>=200美元,您在sql中的问题是:所有订单总额>=$200,谁购买了这些订单?获得重复值意味着i)糟糕的数据库设计ii)糟糕的查询顺序。我认为我们应该避免导致重复值的去规范化步骤。我不是说要完全避免去规范化。