将物化视图中的行数与另一个物化视图连接时需要高效的SQL
我正在使用的数据库引擎:PostgreSQL 9.5.2 我想做的事: 我的PostgreSQL中有以下两个物化视图: 1) 说明供应商材料视图 vendor_id sol_id states_list total_revenue --------- ------ ----------- ------------- 1234 abc CA, AZ 23000.00 5678 abc TX, FL 12000.00 9012 def AZ, TX 67000.00 sol_id vendor_id ------ --------- abc 1234 def 5678 为了获得正确的行数,我还尝试了:将物化视图中的行数与另一个物化视图连接时需要高效的SQL,sql,postgresql,Sql,Postgresql,我正在使用的数据库引擎:PostgreSQL 9.5.2 我想做的事: 我的PostgreSQL中有以下两个物化视图: 1) 说明供应商材料视图 vendor_id sol_id states_list total_revenue --------- ------ ----------- ------------- 1234 abc CA, AZ 23000.00 5678 abc TX,
SELECT
state.vendor_id,
state.sol_id,
count(*)
FROM state_vendors_mat_view state
JOIN interested_vendors_mat_view iv ON (iv.vendor_id = state.vendor_id)
WHERE state.sol_id = 'abc'
GROUP BY state.vendor_id, state.sol_id
这两个问题都没有给我正确的解决办法
非常感谢您的帮助。谢谢。我不知道为什么您的查询不起作用,但可能是因为子查询中的比较使用了
snid
,而不是solu id
(根据您问题中的数据格式,这应该会生成错误)
在任何情况下,查询将更简单地使用exists
表示:
SELECT sv.*,
(exists (select 1
from interested_vendors_mat_view iv
where iv.vendor_id = sv.vendor_id and iv.sol_id = 'abc'
)
) as is_interested
FROM state_vendors_mat_view sv
WHERE sv.sol_id = 'abc';
考虑一个
左连接
查询,该查询带有对感兴趣
的条件列计算,避免任何子查询需求:
SELECT s.vendor_id,
CASE WHEN i.sol_id = 'abc'
THEN TRUE
ELSE FALSE
END AS is_interested,
s.sol_id,
s.states_list,
s.total_revenue
FROM state_vendors_mat_view s
LEFT JOIN interested_vendors_mat_view i
ON (s.sol_id = i.sol_id) AND (s.vendor_id = i.vendor_id)
WHERE s.sol_id = 'abc'
您的查询如何不起作用?正确的结果集是什么?您得到的结果集是什么?@GordonLinoff第一个查询为is\u interest列的每一行提供了一个True。第二个查询为我提供了state\u vendors\u mat\u视图中vendor\u id的总行数。我现在就试试你的SQL。谢谢。这个SQL成功了!非常感谢你!顺便说一句:我的意思是
snid
是sol\u id
(更新了我的问题)。我也会试试这个SQL。谢谢。这个SQL也可以工作。你只是错过了案件陈述书前面的一个公开的段落。谢谢,太好了!很好的捕获-事实上,不需要任何括号。希望未来的读者能得到帮助。
SELECT sv.*,
(exists (select 1
from interested_vendors_mat_view iv
where iv.vendor_id = sv.vendor_id and iv.sol_id = 'abc'
)
) as is_interested
FROM state_vendors_mat_view sv
WHERE sv.sol_id = 'abc';
SELECT s.vendor_id,
CASE WHEN i.sol_id = 'abc'
THEN TRUE
ELSE FALSE
END AS is_interested,
s.sol_id,
s.states_list,
s.total_revenue
FROM state_vendors_mat_view s
LEFT JOIN interested_vendors_mat_view i
ON (s.sol_id = i.sol_id) AND (s.vendor_id = i.vendor_id)
WHERE s.sol_id = 'abc'