【问题标题】:omit null columns and also increase performance省略空列并提高性能
【发布时间】:2017-07-03 20:32:51
【问题描述】:

我在下面有一个查询,它从 3 个表中检索数据。

select *
from vendor_allocation as va, district as d, vendor as v 
where va.district_id = d.id and va.vendor_id = v.id

结果中有很多空列,执行大约需要 315 毫秒。我需要省略空列并更快地执行查询。我尝试使用 COALESCE,但得到了预期的结果。请帮忙。

【问题讨论】:

  • 从不FROM 子句中使用逗号。 始终使用正确、明确的JOIN 语法。
  • 另外,您的预期结果是什么?所有供应商的列表,附有地区?
  • 要“省略”列,不要将它们放在选择列表中。为什么select * 不应该在生产查询中使用的另一个很好的例子。
  • select * 返回所有列。通过列出它们来定义要返回的列(例如select somecolumn, someothercolumn, jcwashere from somekindatable
  • 我必须在@GordonLinoff 的评论中添加一句话:使用逗号您可以执行cross joinCartesian Product。来自vendot_allocation 的每一行与district 的每一行组合,然后与vendor 组合。这会产生大量的meaningless 数据

标签: sql postgresql


【解决方案1】:

以下查询将仅返回所有表中存在的值。如果您想考虑 vendor_allocation 中可能没有相应行存在于区/供应商中的行,请使用左连接。这些行将以 null 作为连接表中的值返回。

select *
from vendor_allocation as va
  join district as d using ON va.district_id = d.id
  join vendor as v using ON va.vendor_id = v.id;

使用左连接

select *
from vendor_allocation as va
  left join district as d ON va.district_id = d.id
  left join vendor as v ON va.vendor_id = v.id;

【讨论】:

    【解决方案2】:

    这会给你一个供应商列表,附有地区。如果您不想要没有地区的人,请使用内部联接:

    select v.VendorName, d.DistrictName 
    from vendor as v 
    left join vendor_allocation as va
    on v.id=va.vendor_id 
    left join district as d
    on va.district_id =d.id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多