将两个SQL select合并为一个

时间:2013-02-04 11:39:30

标签: sql postgresql

我有两个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。有人能告诉我怎么做吗?

非常感谢

3 个答案:

答案 0 :(得分:4)

这应该为你做。我不熟悉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

答案 1 :(得分:3)

如果你真的需要这种方式(使用两个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

你也可以将boolean类型转换为整数并缩短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

因为真的&gt;假和假&lt;是的(至少在PostgreSQL中)你可以写:

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

答案 2 :(得分:0)

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