【问题标题】:SQL Query to get unique list获取唯一列表的 SQL 查询
【发布时间】:2016-01-26 21:40:16
【问题描述】:

我有一个名为“资源”的表

Machine     Host        Enabled
mach1       host1       TRUE
mach2       host1       FALSE
mach3       host1       FALSE
mach4       host2       TRUE
mach5       host2       TRUE

我想获取与它们关联的所有资源/机器的 Enabled 为 True 的主机列表。

我试过sql查询-

select distinct Host from resources where Enabled = TRUE;

但是该查询将 host1 和 host2 作为答案返回给我,而我期望答案只是 host2。谁能帮我一个可以实现这个的 sql 查询?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    试试这个:

    SELECT Host
    FROM resources
    GROUP BY Host        
    HAVING COUNT(*) = COUNT(CASE WHEN Enabled = True THEN 1 END)
    

    或:

    SELECT DISTINCT Host 
    FROM resources AS r1
    WHERE Enabled = TRUE AND 
          NOT EXISTS (SELECT 1 
                      FROM resources AS r2
                      WHERE r1.Host = r2.Host AND r2.enabled = FALSE)
    

    【讨论】:

    • 谢谢。这两个查询都有效。使用 Group By 和 Distinct 有什么区别?
    • @sid 查看here 以获得您问题的答案。此外,如果它们可以帮助您解决问题,您可以接受任何可用的答案。
    • 这里发布的所有答案都有效。但是这里发布的第一个解决方案对我最有用,因此接受了这个答案。
    【解决方案2】:

    试试这个,让我知道。

    SELECT DISTINCT(Host)
    FROM Resources
    WHERE Enabled = TRUE AND Host NOT IN (Select Host FROM Resources WHERE Enabled = FALSE)
    

    【讨论】:

    • 这也有效。但是,我将在第二个 select 语句的末尾添加一个限制 1。它可能会使查询更快。
    • 是的,这将使查询更快。
    【解决方案3】:

    试试

    select distinct Host from resources res1 where not exist (
       select 1 from resources res2 WHERE res1.host = res2.host AND Enabled = FALSE limit 1
    );
    

    【讨论】:

      【解决方案4】:

      这也有效

      select host from resources e
      having count(e.host)=(select count(enebled) from resources 
                          where enebled='TRUE' and host = e.host)
      group by host;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-17
        • 1970-01-01
        • 1970-01-01
        • 2020-04-08
        • 2011-03-10
        • 2012-10-20
        • 2011-02-10
        相关资源
        最近更新 更多