SQL-连接两个查询,并在不匹配时设置默认值

时间:2020-07-05 06:25:53

标签: sql join

是否有可能合并以下两个查询,并且当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

3 个答案:

答案 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;
相关问题