是否有可能合并以下两个查询,并且当offline
的条目不匹配时也具有默认值status
?
SELECT
Objects,
COUNT(*) AS Objects_count
FROM
table1
GROUP BY
Objects
---------------------------------
Objects | Objects_count
---------------------------------
Unitied_states | 2
Germany | 2
Turkey | 1
Kuwait | 2
注意:当状态不等于1时,表2中没有该条目。因此,在表二中,我们只有在线条目。
SELECT
Objects,
CASE
WHEN status = 1 THEN 'ONLINE'
END AS Status
FROM
table2
WHERE
status = 1
GROUP BY
Objects
--------------------------
Objects | Status
--------------------------
Unitied_states | Online
Turkey | Online
我希望最终输出像
-------------------------------------------
Objects | Objects_count | Status
-------------------------------------------
Unitied_states | 2 | Online
Germany | 2 | Offline
Turkey | 1 | Online
Kuwait | 2 | Offline
答案 0 :(得分:0)
使用left join
上的Objects
table1和table2尝试以下操作。
select
t1.Objects,
coalesce(COUNT (t1.*), 0) as Objects_count,
case
when t2.status = 1 then 'Online'
else 'Offline'
end as Status
from table1 t1
left join table2 t2
on t1.Objects = t2.Objects
GROUP BY
Objects,
case
when t2.status = 1 then 'Online'
else 'Offline'
end
答案 1 :(得分:0)
是的,可以通过执行FULL OUTER JOIN
来实现。
我还假设您想在JOIN
列上Objects
:
SELECT
COALESCE( t1.Objects, t2.Objects ) AS Objects,
COALESCE( t1.Objects_Count, 0 ) AS Objects_Count,
-- t2.Status,
CASE t2.status WHEN 1 THEN 'Online' ELSE 'Offline' END AS status
FROM
(
SELECT
Objects,
COUNT(*) AS Objects_count
FROM
table1
GROUP BY
Objects
) AS t1
FULL OUTER JOIN
(
SELECT
Objects,
status
FROM
table2
) AS t2 ON t1.Objects = t2.Objects
答案 2 :(得分:0)
我将使用相关子查询:
SELECT t1.Objects, COUNT(*) AS Objects_count,
(CASE WHEN EXISTS (SELECT 1
FROM table2 t2
WHERE t2.Objects = t1.Objects AND t2.status = 1
)
THEN 'Online' ELSE 'Offline'
END) as status
FROM table1 t1
GROUP BY t1.Objects
这将返回table1
中的所有行以及状态。
或者,如果table2
没有重复的行,则可以使用简单的LEFT JOIN
和聚合:
SELECT t1.Objects, COUNT(*) AS Objects_count,
(CASE WHEN COUNT(t2.Objects) > 0 THEN 'Online' ELSE 'Offline' END) as status
FROM table1 t1 LEFT JOIN
table2 t2
ON t2.Objects = t1.Objects AND t2.status = 1
GROUP BY t1.Objects;