EXISTS不引入子查询时,select列表中只能指定一个表达式

Only one expression can be specified in the select list when the sub-query is not introduced with EXISTS

SELECT
  ( Select 
COUNT(t2.ID) as Total_HH_Memebers_Primary,t1.SETTLEMENT_ID 
from 
PScData t1 
INNER JOIN 
PscMemberData t2 ON t2._PARENT_AURI  = t1.URI
WHERE  EXISTS (SELECT 1
               FROM   PScData t1
               WHERE  t1.SETTLEMENT_ID = SETTLEMENT_ID 
                AND t2.EDUCATION_LEVEL = 5 
               HAVING Count(*) > 1)
               Group By t1.SETTLEMENT_ID 
) col1



  , (Select 
COUNT(t2.ID) as Total_HH_Memebers_Secondary,t1.SETTLEMENT_ID 
from 
PScData t1 
INNER JOIN 
PscMemberData t2 ON t2._PARENT_AURI  = t1.URI
 WHERE  EXISTS (SELECT 1
               FROM   PScData t1
               WHERE  t1.SETTLEMENT_ID = SETTLEMENT_ID 
                AND t2.EDUCATION_LEVEL = 10 
              HAVING Count(*) > 1) 
               Group By t1.SETTLEMENT_ID 

) col2

这是我的查询,我想根据 "WHERE" 条件从相同的 table 以列的形式获得两个不同的结果,当我这样做时它给出了这个错误。有人可以如何正确吗?

尝试使用 cte

;with col1 as 
(  Select 
COUNT(t2.ID) as Total_HH_Memebers_Primary,t1.SETTLEMENT_ID 
from 
PScData t1 
INNER JOIN 
PscMemberData t2 ON t2._PARENT_AURI  = t1.URI
WHERE  EXISTS (SELECT 1
               FROM   PScData t1
               WHERE  t1.SETTLEMENT_ID = SETTLEMENT_ID 
                AND t2.EDUCATION_LEVEL = 5 
               HAVING Count(*) > 1)
               Group By t1.SETTLEMENT_ID 
),col2 as 
(Select 
COUNT(t2.ID) as Total_HH_Memebers_Secondary,t1.SETTLEMENT_ID 
from 
PScData t1 
INNER JOIN 
PscMemberData t2 ON t2._PARENT_AURI  = t1.URI
 WHERE  EXISTS (SELECT 1
               FROM   PScData t1
               WHERE  t1.SETTLEMENT_ID = SETTLEMENT_ID 
                AND t2.EDUCATION_LEVEL = 10 
              HAVING Count(*) > 1) 
               Group By t1.SETTLEMENT_ID 

)  

select col1.SETTLEMENT_ID,col2.Total_HH_Memebers_Secondary, col1.Total_HH_Memebers_Primary from col1 
join col2 on col1.SETTLEMENT_ID=col2.SETTLEMENT_ID

错误消息告诉您:select 列表中的子查询不允许 return 超过一个值,每个子查询都是如此。

您有 2 列和多行 return 来自此查询:

Select COUNT(t2.ID) as Total_HH_Memebers_Primary, t1.SETTLEMENT_ID 
from PScData t1 
INNER JOIN PscMemberData t2 ON t2._PARENT_AURI  = t1.URI
WHERE  EXISTS (SELECT 1
               FROM   PScData t1
               WHERE  t1.SETTLEMENT_ID = SETTLEMENT_ID 
                AND t2.EDUCATION_LEVEL = 5 
               HAVING Count(*) > 1)
Group By t1.SETTLEMENT_ID 

因此不允许在 select 子句中作为 "subquery"。

您需要改用 "conditional aggregates",在别处有说明。

使用条件聚合:

SELECT
    SUM(CASE WHEN t2.EDUCATION_LEVEL = 5
             THEN 1 ELSE 0 END) AS Total_HH_Members_Primary,
    SUM(CASE WHEN t2.EDUCATION_LEVEL = 10
             THEN 1 ELSE 0 END) AS Total_HH_Members_Secondary,
    t1.SETTLEMENT_ID 
FROM PScData t1 
INNER JOIN PscMemberData t2
    ON t2._PARENT_AURI = t1.URI
GROUP BY
    t1.SETTLEMENT_ID
HAVING COUNT(*) > 1;

select 子句中的两个子查询对我来说完全没有必要。而且我认为我们可以删除 EXISTS 子句,并将 HAVING 子句移动到外部查询。

我已经接受了上面的答案,我也找到了另一种方法:

两种方法都可行,下面给出我找到的方法:

WITH EDU_LEVEL AS 
(SELECT t1.SETTLEMENT_ID,t2.EDUCATION_LEVEL from 
PScData t1 
INNER JOIN 
PscMemberData t2 ON t2._PARENT_AURI  = t1.URI
)


SELECT  SETTLEMENT_ID,
(Select COUNT(*) FROM EDU_LEVEL    WHERE  SETTLEMENT_ID = T.SETTLEMENT_ID AND EDUCATION_LEVEL = 5 ) Total_HH_Memebers_Primary,
(Select COUNT(*) FROM EDU_LEVEL    WHERE  SETTLEMENT_ID = T.SETTLEMENT_ID AND EDUCATION_LEVEL = 10 ) Total_HH_Memebers_Secondary



FROM EDU_LEVEL AS T
Group By SETTLEMENT_ID