在第二段中这样说:
“结果集具有重复项的事实经常(但并非总是)是由于数据库设计不佳、查询无效或两者兼而有之的结果”。
稍后以 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。但是使用子查询来避免主查询中的重复是一个好主意吗?
在这种情况下,Persons和orders,我猜数据库设计还不错,因为我不知道我还有什么其他选项来设计这个模型,而且我猜查询很简单,但是我有怀疑在这种情况下获取重复项是否是错误查询的标志。
总之,在这种情况下,获取重复项是一个错误的查询?
谢谢。
最佳答案
我认为第一个查询就这样不好。对于获取稍后需要使用 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
关于sql-server - 获取重复项真的是一个糟糕的查询还是糟糕的数据库设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36885354/