代码之家  ›  专栏  ›  技术社区  ›  JT.

在原始查询或单独查询中使用大小写更有效吗?

  •  0
  • JT.  · 技术社区  · 8 年前

    我无法显示真实的查询,但下面是我正在做的事情类型的示例:

    select
      t1.contract,
      t1.state,
      t1.status,
      t2.product,
      case
        when t2.product_cost > 100 and t3.status = 'Closed' then 'Success'
        when t2.product_cost <= 100 and t3.status = 'Closed' then 'Semi-Success'
        else 'Failure'
      end as performance,
      t3.sales_date
    from contract_table as t1 
    left join product_table as t2 on t1.prodkey = t2.prodkey
    left join sales_table as t3 on (t1.client_number = t3.client_number and t1.contract=t3.contract)
    where t1.client_number in (1, 2, 5, 8, 10)
    

    我的问题是。将3个表连接到一个视图中,该视图具有执行case语句所需的详细信息,然后运行第二个查询,使用case语句创建新变量,这样会更高效吗?或者我在这里做的事情效率更高?

    基本上,我不知道SQL是如何处理select语句的,也不知道从合同表(而不是销售表)中过滤客户机的where语句,即使client\U number字段在这两个表中。

    1 回复  |  直到 8 年前
        1
  •  1
  •   user4843530 user4843530    8 年前

    在所有其他条件相同的情况下,我能看到的唯一会以某种方式改变效率的事情是,在外部查询中是否有where子句条件。如果在视图上执行的外部查询将包含限制返回的记录数的where子句,那么在其上放置case语句将更有效。这样,case操作将只对通过这些条件的记录执行,而不是对通过视图条件的每个记录执行,结果这些值被外部查询丢弃。

    对于视图,我倾向于尽可能地保留原始数据。部分原因是由于这个原因,因此在决定使用哪些行之后,对视图进行操作的任何查询都只能对这些行执行必要的操作。

    至于sql如何从contract表而不是sales表中过滤客户机,请仔细考虑where子句和连接。where子句表示只抓取合同表的客户机为1,2,5,8,10的记录。但连接条件告诉它只抓取销售记录,其中该表的客户号与合同表的客户端号匹配。如果它从合同中获取的唯一记录是1,2,5,8,10,那么与该连接匹配的唯一销售记录将是客户编号也为1,2.5,8.10的记录。这有意义吗?