编写“断言”视图 - 选择计数(*)子查询的联合

时间:2014-01-16 20:37:20

标签: sql postgresql count

我不确定这个问题的适当标题是什么。

无论如何,我有一个相当复杂的SQL架构,并且在它之上构建了许多视图。 为了确保视图正确,我维护了一些“断言”,即SQL中的布尔表达式,用COUNT(*)和其他应该为真的聚合函数表示。

举一个例子,假设我有两个表table_atable_b以及两个非常简单的视图,而不仅仅是重现它们:

CREATE TABLE table_a (foo VARCHAR(50));
CREATE TABLE table_b (foo VARCHAR(50));
CREATE OR REPLACE VIEW view_a AS SELECT * FROM table_a;
CREATE OR REPLACE VIEW view_b AS SELECT * FROM table_b;

然后两个非常简单的断言是view_a中的行数应该等于table_a中的行数。 view_btable_b分别相同。

然后我会创建“断言”视图:

CREATE VIEW ASSERTIONS AS
SELECT 
    ((SELECT COUNT(*) FROM view_a) - (SELECT COUNT(*) FROM table_a)=0) AS a
    ,
    ((SELECT COUNT(*) FROM view_b) - (SELECT COUNT(*) FROM table_b)=0) AS b

这会产生:

select * from assertions;

a    |  b
-----------
true |  true

上面的问题是我希望信息作为不同的行存在,而不是作为不同的列存在,这样我就可以为每个“断言”添加一个名称甚至描述。此外,添加更多断言对于我现在使用的SQL变得很麻烦,因为它们显示为新列(而不是新行)

如何编写上述“断言”视图,以便我得到:

 select * from assertions;

 description   | result
 ----------------------
 'blah blah a' | true
 'blah blah b' | true

1 个答案:

答案 0 :(得分:2)

联合个人select

CREATE VIEW ASSERTIONS AS
select 
    'blah blah a' as description, 
    ((SELECT COUNT(*) FROM view_a) - (SELECT COUNT(*) FROM table_a)=0) AS result
union all
select 
    'blah blah b', 
    ((SELECT COUNT(*) FROM view_b) - (SELECT COUNT(*) FROM table_b)=0) 

union all绕过(不必要的)distinct结果,因为您已经知道您将选择不同的行。您还可以在后续select上省略列别名。