Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将物化视图中的行数与另一个物化视图连接时需要高效的SQL_Sql_Postgresql - Fatal编程技术网

将物化视图中的行数与另一个物化视图连接时需要高效的SQL

将物化视图中的行数与另一个物化视图连接时需要高效的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,

我正在使用的数据库引擎: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 为了获得正确的行数,我还尝试了:

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'