【问题标题】:Combine two SQL select into one将两个 SQL 选择合二为一
【发布时间】:2013-02-04 20:17:48
【问题描述】:

我有两个 SQL SELECT COUNT 语句:

SELECT COUNT(*) FROM table1 t1 
INNER JOIN table2 t2 ON t2.id = t1.rowid
WHERE t1.flag1 = false AND t2.flag2 = true;

SELECT COUNT(*) FROM table1 t1 
INNER JOIN table2 t2 ON t2.id = t1.rowid
WHERE t1.flag1 = true AND t2.flag2 = false;

可以看出,这两个语句的唯一区别是翻转条件。

但是我想要做的是将这两个语句组合成一个,这样输出就变成了一个有两列的表,第一列包含第一个语句的结果,第二列包含第二个语句的结果。比如:

   count1   |   count 2
-------------------------
    3456    |     9864

顺便说一下,我使用的是 PostgreSQL。有人可以告诉我该怎么做吗?

非常感谢

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    这应该为你做。我对 PostgreSql 不熟悉,但我认为它会起作用。

    SELECT 
        SUM(CASE WHEN t1.Flag1 = false AND t2.flag2 = true THEN 1 ELSE 0 END) Count1,
        SUM(CASE WHEN t1.Flag1 = true AND t2.flag2 = false THEN 1 ELSE 0 END) Count2
    FROM 
        table1 t1 
        INNER JOIN table2 t2 ON t2.id = t1.rowid
    

    【讨论】:

      【解决方案2】:

      如果你真的需要这种方式(使用两个 sql 查询并将它们组合起来),那么:

      select * from
       (SELECT COUNT(*) FROM table1 t1 INNER JOIN table2 t2 ON t2.id = t1.rowid WHERE t1.flag1 = false AND t2.flag2 = true) a,
       (SELECT COUNT(*) FROM table1 t1 INNER JOIN table2 t2 ON t2.id = t1.rowid WHERE t1.flag1 = true AND t2.flag2 = false) b
      

      根据您的 SQL,这将是更好的解决方案:

      select
          sum (case when not t1.flag1 and t2.flag2 then 1 else 0 end) as count1,
          sum (case when t1.flag1 and not t2.flag2 then 1 else 0 end) as count2
      FROM 
          table1 t1 
          INNER JOIN table2 t2 ON t2.id = t1.rowid
      

      您也可以将布尔类型转换为整数并缩短 sql (true::int = 1, false::int = 0):

       select 
          sum((flag1::int<flag2::int)::int) count1,
          sum((flag1::int>flag2::int)::int) count2    
       from
          table1 t1 
          join table2 t2 ON t2.id = t1.rowid
      

      而且因为 true > false 和 false

       select 
          sum((flag1 < flag2)::int) count1,
          sum((flag1 > flag2)::int) count2    
       from
          table1 t1 
          join table2 t2 ON t2.id = t1.rowid
      

      【讨论】:

        【解决方案3】:
        Select * from
        (
            SELECT COUNT(*) FROM table1 t1 
            INNER JOIN table2 t2 ON t2.id = t1.rowid
            WHERE t1.flag1 = false AND t2.flag2 = true) tab1,
        (
            SELECT COUNT(*) FROM table1 t1 
            INNER JOIN table2 t2 ON t2.id = t1.rowid
            WHERE t1.flag1 = true AND t2.flag2 = false) tab2
        

        【讨论】:

          猜你喜欢
          • 2014-08-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多