2014-01-16 49 views
0

我不確定這個問題的適當標題是什麼。編寫「斷言」視圖 - 選擇計數(*)子查詢的聯合

無論如何,我有一個相當複雜的SQL模式和一些建立在它上面的視圖。 爲了確保視圖正確,我維護一些「斷言」,即SQL中的布爾表達式,用COUNT(*)和其他應該爲true的聚合函數表示。

舉個例子,比如說我有兩個表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 

回答

2

只是工會個體select S:

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 s上省略列別名。