重复是真的是一个糟糕的查询或糟糕的数据库设计?

时间:2016-04-27 09:13:53

标签: sql-server performance tsql distinct

I have read this article

在第二个paragrpah中说:

"结果集有重复的事实经常(但并不总是)是数据库设计不佳,查询无效或两者兼而有之的结果。

后来以Adventures数据库为例,我猜它有一个很好的设计。

嗯,我怀疑是这种情况。我需要桌子,人员和订单,我想让所有至少有一个订单总数> = 200美元的人。我会使用这个查询:

Select Persons.* from Persons, Orders where
Orders.IDPerson = Persons.IDPerson
and Orders.Total >= 200;

在这种情况下,我可以多次获得同一个人,因为有多个订单总数为200或更多。我真的希望每个人都在结果中一次,所以这个查询是一个糟糕的查询,因为我可以多次得到同一个人吗?

另一个选择是此查询:

select * from Person where
IDPerson IN(select IDPerson from Orders where total >= 200);

在这种情况下,每个人只能获得一次,虽然这个人有多个订单,总数> = 200.但是使用子查询来避免主查询中的重复是一个好主意吗?

在这种情况下,人员和订单,我猜数据库设计并不坏,因为我不知道我有哪个选项来设计这个模型,而且我猜的查询很简单,但是我有疑问,如果在这种情况下得到重复,这是一个不好的查询的迹象。

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

感谢。

1 个答案:

答案 0 :(得分:2)

我认为第一个查询很糟糕。似乎没有用于获取以后需要使用DISTINCT删除的重复项。

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

SQL Server IN vs. EXISTS Performance

此类查询也是可能的:

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