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
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