Oracle SQL 在 select 和简单集合之间相交

Oracle SQL intersect between select and simple collection

我想写一个这样的 SQL 脚本:

select count(*) from table1 t1 where exists (
    select t2.desired_col from table2 t2 where t1.ID = t2.reference_t1_id 
        intersect 
    (2, 5, 9, 10)
);

目标是告诉我,t1 中有多少条目在 t2desired_col 和给定集合(即 (2, 5, 9, 10) 之间至少有一个共同值). t2t1 具有多对一关系。但是,似乎我无法在 select 和简单集合之间相交。作为一种解决方法,我像这样包装了给定的集合:

select count(*) from table1 t1 where exists (
    select t2.desired_col from table2 t2 where t1.ID = t2.reference_t1_id 
        intersect  
    select desired_col from table t2 where desired_col in (2, 5, 9, 10)
);

我认为这个解决方案看起来有点难看,想知道是否有更好的方法来找到 select 语句和简单集合之间的交集。

您需要将您的 ID 列表变成一个实际的集合,然后您可以在 SQL 中使用 table() 函数。像这样:

select count(*) from table1 t1 
where exists (
    select t2.desired_col from table2 t2 
    where t1.ID = t2.reference_t1_id 
    intersect
     select * from table(sys.odcinumberlist (2, 5, 9, 10))
);

有几种不同的解决方案。例如,您可以使用 IN 子查询扩展 WHERE 子句,而不是交集:

and t2.desired_col in (select * from table(sys.odcinumberlist (2, 5, 9, 10)))

或者确实

and t2.desired_col in (2, 5, 9, 10)

这使用 Oracle 提供的集合类型 sys.odcinumberlist,它是一个数字数组。