在第二个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中,在这种情况下获取重复项是一个错误的查询?
感谢。
答案 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