我有下表:
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}}
上面的示例可以正常工作,但用于确定有效符号列表的子查询在两次都是相同的并且非常大。如示例中那样运行两次非常有效。
有没有办法在不重复两个相同的子查询的情况下执行此操作?
答案 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
是视图,则适当的索引甚至可以工作,尽管效果取决于视图的复杂性。
您似乎遇到两种外键关系。如果显式声明这些关系,则数据库将强制表中的列与有效符号匹配。