我有两种观点:current_campaign
和last_campaign
:
current_campaign
总是有一行或没有
last_campaign
总是有一行。
我还有另一种观点,需要从其中一种获取信息:contributors
。
如果current_campaign
有一行,我需要给它一个偏好
如果current_campaign
为空,那么我可以从last_campaign
获取信息
这可能吗?
答案 0 :(得分:3)
由于每个视图最多可以给出1行,因此有一个非常简单且廉价的解决方案:
-- CREATE VIEW contributors AS
SELECT * FROM current_campaign
WHERE ...
UNION ALL
SELECT * FROM last_campaign
WHERE ...
LIMIT 1;
如果这是过度简化:
current_campaign
计算EXISTS
中的行或运行LIMIT 1
半联接是浪费时间,因为LIMIT
会自动执行您需要的所有操作。只要找到足够的行来满足EXPLAIN ANALYZE
(在这种情况下为1),Postgres就会停止执行。对于列表中的任何后续SELECT
,您会在UNION ALL
的输出中看到“(从未执行过)”。请参阅以下链接了解更多信息。
这是一个实施细节,仅适用于UNION
(不是ORDER BY
)且没有外部TABLE current_campaign
或其他条款会强制Postgres考虑所有行。我希望其他RDBMS的行为相同,但我只是知道关于Postgres的。 保证可以在当前9.5版本的所有版本中使用。
关于短语<audio id="soundContainer" preload="metadata" loop></audio>
:
相关,有更多解释,同样更冗长:
答案 1 :(得分:0)
我认为您的意思是view
或table
。 Vision
实际上不是SQL词汇表术语。以下是使用union all
和not exists
的一种方式:
select cc.*
from current_campaign cc
union all
select lc.*
from last_campaign lc
where not exists (select 1
from current_campaign cc
where cc.campaignId = lc.campaignId
);