多个查询与单个(多个有多个连接)

时间:2017-07-13 01:21:53

标签: sql postgresql

最近偶然发现了这种情况。做两个查询可能是" light"在我的情况下,我只想知道什么是更好的大数据集。总体上更好(性能,速度等)。

目前我单独查询2 1:N(has-many)关系并减少/转换应用程序中的数据。

看起来这个变形/缩小了:

[
  'field' => 'value',
  'hasMany-1' => [],
  'hasMany-2' => []
]

我实际上有点想要做单独的查询,因为它消除了减少它的痛苦,如果我有超过2个hasMany查询并且更可读但代码目前有效,所以我可能只是做它下一次。

妥协是否值得?同样,在我的情况下,它可能是非常轻的&#34;因为我只有很少的行(<100)并且结构并不复杂,因为它还处于早期阶段。

但是如果我下次遇到这种情况并且数据集越来越大,我就会问。

**编辑**

所以,我所谈论的有很多关系是:customer有很多phonespets

我当前的查询返回此结果(简化):

customer_id | pet_name | phone
1           | john     | 1234
1           | john     | 5678
2           | jane     | 1357
2           | jane     | 2468
2           | joe      | 1357
2           | joe      | 2468

我认为我的查询很好。对于某些行重复似乎是合乎逻辑的,因为另一个字段具有不同的值。

2 个答案:

答案 0 :(得分:4)

通常,您应该发出一个查询并让优化程序为您完成工作。至少,这可以节省多次到数据库和查询编译的往返。

在某些情况下,多个查询可以获得更好的性能,但我认为最好从单个查询开始。

对于多个多对多维度的连接,您有一个特定问题。没有必要“通常”进行连接,然后“减少”结果。有更有效的方法。

我建议你问另一个问题。提供样本数据,所需结果以及您正在尝试的逻辑的说明。您可以学习更有效的方法来编写单个查询。

答案 1 :(得分:0)

你没有描述你的表结构所以我假设很少。 如果您想将宠物和手机放在一行,请执行以下操作:

select c.customer_id, c.name,  
       array_to_string((array_agg(p.pet_name)),',')  pet_names
       array_to_string((array_agg(ph.phone)),',')  phones
  from customer c, pet p, phones ph
 where p.customer_id=1
   and p.customer_id=c.customer_id
   and ph.customer_id=c.customer_id
 group by c.customer_id, c.name

如果您希望每个pet_name包含所有可能的电话号码:

select c.customer_id, c.name,  
       p.pet_name
       array_to_string((array_agg(ph.phone)),',')  phones
  from customer c, pet p, phones ph
 where p.customer_id=1
   and p.customer_id=c.customer_id
   and ph.customer_id=c.customer_id
 group by c.customer_id, c.name, p.pet_name

如果我们谈论性能,那么通过customer_id对宠物和手机进行2次查询会更快。但是,直到你有数百万行,它并不那么重要。 当然你应该在customer_id上有索引。