有一张桌子:
where user_id in (Select value from STRING_SPLIT( @user_id_list, ',')
假设我有记录key1, fkey1, option, symbol
1 5 'A' 1
2 6 'B' 1
3 7 'C' 1
4 8 'D' 2
的数据。该行具有key1=2
,因此我的目标是获取所有行(尤其是列symbol = 1
的值),其中fkey1
(在此处期望输出:symbol = 1
)。
问题:是否可以通过一个fkey = 5,6,7
查询来完成,并且只能查询一次该表(!)?不喜欢:
select
我正在寻找一种最大限度地优化它的方法。实际上,该表有更多列,而PK / FK则由几列组成。
答案 0 :(得分:1)
是的,您只需一个查询就可以完成此操作,而无需进行自我联接。在整个表上使用分析函数来找到匹配的符号:
Oracle设置:
CREATE TABLE table_name ( key1, fkey1, "option", symbol ) AS
SELECT 1, 5, 'A', 1 FROM DUAL UNION ALL
SELECT 2, 6, 'B', 1 FROM DUAL UNION ALL
SELECT 3, 7, 'C', 1 FROM DUAL UNION ALL
SELECT 4, 8, 'D', 2 FROM DUAL;
查询:
SELECT *
FROM (
SELECT t.*,
MAX( CASE key1 WHEN 2 THEN symbol END ) OVER () AS symbol_to_match
FROM table_name t
)
WHERE symbol = symbol_to_match
输出:
KEY1 | FKEY1 | option | SYMBOL | SYMBOL_TO_MATCH ---: | ----: | :----- | -----: | --------------: 1 | 5 | A | 1 | 1 2 | 6 | B | 1 | 1 3 | 7 | C | 1 | 1
db <>提琴here
答案 1 :(得分:0)
您可以避免子查询,但是需要两次与表相同的联接
select a.fkey1
from table a
inner join table b on a.symbol = b.symbol and b.fkey1 = 2
在symbol上使用适当的索引,或者在symbole和fkey1上使用复合索引,性能应该很好