sql-server - 获取重复项真的是一个糟糕的查询还是糟糕的数据库设计?

标签 sql-server performance t-sql distinct

I have read this article

在第二段中这样说:

“结果集具有重复项的事实经常(但并非总是)是由于数据库设计不佳、查询无效或两者兼而有之的结果”。

稍后以 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/

相关文章:

c# - SignalR 和 sql 仅依赖于插入

android - 为什么在缩放手势期间调用 setScaleX 会导致闪烁?

c# - 根据其他两列中的值透视一列中的行值

sql-server - T sql 使用内连接选择数据透视表

SQL Server 按替代分组而不丢失行

javascript - mvc 5 中图像未成功上传

PHP mySQL 显示好友列表中的帖子

sql - 如何在 MS Access 2007 或 MS SQL Server 2005 中通过 SQL 将字段转换为行

algorithm - 如何找到这个函数的 T(n)?

performance - 图像快速特征提取