我不确定这个问题的适当标题是什么。
无论如何,我有一个相当复杂的SQL架构,并且在它之上构建了许多视图。
为了确保视图正确,我维护了一些“断言”,即SQL中的布尔表达式,用COUNT(*)
和其他应该为真的聚合函数表示。
举一个例子,假设我有两个表table_a
和table_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_b
和table_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
答案 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
上省略列别名。