确保两列仅包含来自同一子查询的有效结果

时间:2016-07-28 10:13:25

标签: sql postgresql

我有下表:

select * 
from mytable
where symbol_01 in (
    select valid_symbols 
    from somewhere)
and symbol_02 in (
    select valid_symbols 
    from somewhere)

我需要一个确保symbol_01和symbol_02都包含在有效符号列表中的查询。换句话说,我需要这样的东西:

{{1}}

上面的示例可以正常工作,但用于确定有效符号列表的子查询在两次都是相同的并且非常大。如示例中那样运行两次非常有效。

有没有办法在不重复两个相同的子查询的情况下执行此操作?

3 个答案:

答案 0 :(得分:3)

另一种方法:

select *
from mytable t1
where 2 = (select count(distinct symbol)
           from valid_symbols vs
           where vs.symbol in (t1.symbol_01, t1.symbol_02));

这假设有效符号存储在具有名为valid_symbols的列的表symbol中。查询也将受益于valid_symbols.symbol

上的索引

答案 1 :(得分:2)

您可以尝试使用CTE;

WITH ValidSymbols AS (
    SELECT DISTINCT valid_symbol
    FROM somewhere
)
SELECT mt.* 
FROM MyTable mt
INNER JOIN ValidSymbols v1
    ON mt.symbol_01 = v1.valid_symbol
INNER JOIN ValidSymbols v2
    ON mt.symbol_02 = v2.valid_symbol

答案 2 :(得分:1)

从性能角度来看,您的查询是执行此操作的正确方法。我会把它写成:

select * 
from mytable t
where exists (select 1 
              from valid_symbols vs
              where t.symbol_01 = vs.valid_symbol
             ) and
      exists (select 1 
              from valid_symbols vs
              where t.symbol_02 = vs.valid_symbol
             ) ;

重要的组成部分是您需要valid_symbols(valid_symbol)上的索引。使用此索引,查找应该非常快。如果valid_symbols是视图,则适当的索引甚至可以工作,尽管效果取决于视图的复杂性。

您似乎遇到两种外键关系。如果显式声明这些关系,则数据库将强制表中的列与有效符号匹配。