如何检查表是否为空,如果是,请检查另一个表?

时间:2016-02-12 12:26:26

标签: sql postgresql union

我有两种观点:current_campaignlast_campaign
current_campaign总是有一行或没有 last_campaign总是有一行。

我还有另一种观点,需要从其中一种获取信息:contributors

如果current_campaign有一行,我需要给它一个偏好 如果current_campaign为空,那么我可以从last_campaign获取信息 这可能吗?

2 个答案:

答案 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)

我认为您的意思是viewtableVision实际上不是SQL词汇表术语。以下是使用union allnot 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
                 );