MSSQL查询调优

时间:2015-02-11 07:23:01

标签: php sql-server union

我有以下情况:

  

1客户有2个产品列表(一个普通,一个私有),这些列表有很多产品,有些产品可以出现在两个列表中。如果产品出现在私人列表中,我想得到它,否则我将把它放在公共列表中。

在您看来,实现这一目标的最快方法是什么?到目前为止,我尝试了以下内容:

  • UNION ALL 然后删除PHP中的重复项(平庸的表演)
  • UNION (表现不佳)

还有其他可能实现这一目标吗?

修改

这是一个演示我拥有http://sqlfiddle.com/#!6/41d2e/2

的小提琴

在小提琴中我假设列表ID为7和1,因为它们是客户1的列表ID,我没有使用连接,因为我已经从php检索到了ID。

我需要的是从私人列表中检索产品(如果存在),否则从公共

作为一个更多的mysql人,我通常会在没有聚合的情况下通过一个组进行此操作,因此使用mysql的正确顺序只会减少不需要的记录(不好的做法,但是足够稳固且高性能):

select *
from pricelist
where listId in (1, 7) 
order by listId asc
group by artnum

因此,例如,如果我想获取客户端ID 1的所有产品,我需要检索thoses:

ID  ARTNUM  ARTDES  LISTID  PRICE
1   1000    potatoes    1   20
1   1001    carrots     7   4

由于客户1有2个列表:1和7(土豆出现在列表1和7中,所以我只想在客户私人列表中使用土豆,而不是公共列表)

希望我足够清楚,抱歉所有的编辑

1 个答案:

答案 0 :(得分:0)

由于我无法弄清楚如何在纯SQL中正确地执行此操作,因此我使用了PHP方法:

  • 在没有UNION / UNION ALL
  • 的情况下检索两个查询
  • 创建2个php集合
  • 合并删除重复项的2个集合