【发布时间】:2017-11-03 09:27:30
【问题描述】:
我有两张桌子 表A
user_id external_party_id
1 6
表 B
user_id activated user_mode sale_mode
1 false 'Customer' 'Web'
1 true 'Customer' 'Local'
1 true 'Partner' 'Web'
1 true 'Partner' 'Local'
结果
user_id external_party_id customer_web customer_local partner_web partner_local
1 6 false true true true
2 7 false false true false
现在我有以下这种查询
SELECT
u.*,
(SELECT activated
FROM TABLE_B
WHERE user_id = u.user_id AND user_mode = 'Customer' AND sale_mode = 'Web'
) AS customer_web,
(SELECT activated
FROM TABLE_B
WHERE user_id = u.user_id AND user_mode = 'Customer' AND sale_mode = 'Local'
) AS customer_local,
(SELECT activated
FROM TABLE_B
WHERE user_id = u.user_id AND user_mode = 'Partner' AND sale_mode = 'Web'
) AS partner_web,
(SELECT activated
FROM TABLE_B
WHERE user_id = u.user_id AND user_mode = 'Partner' AND sale_mode = 'Local'
) AS partner_local,
FROM TABLE_A AS u;
我想知道是否有更好的方法来实现这一点。此查询是否尝试向 TABLE_B 查询四次以填充每个列的值?
【问题讨论】:
-
这是一个枢轴问题:modern-sql.com/use-case/pivot
-
@MarkusWinand 谢谢,我一定会阅读的。只是好奇这种方式是真的效率低下还是只是涉及到更多的代码?
-
只访问一次表会更快。只需确保添加尽可能严格的全局
where子句(WHERE user_mode IN ('Partner', 'Customer') AND sale_mode('Web', 'Local')。根据您的数据,添加索引可能会有所帮助。在 PostgreSQL 中,您甚至可以为此使用部分索引:use-the-index-luke.com/sql/where-clause/… -
在这种情况下使用 WITH 语句是否可以帮助我减少查询?
-
我没有看到在这里使用
with的理由。我会进行数据透视查询。与this answer 不同,我会先在子查询中执行数据透视部分,然后再将其加入另一个表。
标签: sql postgresql pivot crosstab