Sql server 获取重复数据真的是错误的查询还是错误的数据库设计?
第二段说: “resultset有重复项这一事实通常(尽管并不总是)是由于数据库设计不佳、查询效率低下或两者兼而有之。” 稍后使用Adventures数据库作为示例,我想它的设计很好 我怀疑的是这个案子。我需要表格、人员和订单,我想得到所有至少有一份订单的人员,总金额>=200美元。我将使用以下查询: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
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)糟糕的查询顺序。我认为我们应该避免导致重复值的去规范化步骤。我不是说要完全避免去规范化。