Oracle SQL пересекается между выбранной и простой коллекцией - PullRequest
1 голос
/ 13 марта 2019

Я хотел бы написать скрипт 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 имеют хотя бы одно общее значение между desired_col из t2 и данной коллекцией (т.е. (2, 5, 9, 10)). t2 имеет отношение ManyToOne к t1. Тем не менее, кажется, я не могу пересекать между 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 и простой коллекцией.

1 Ответ

3 голосов
/ 13 марта 2019

Вам необходимо превратить ваш список идентификаторов в фактический набор, который вы затем можете использовать в 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))
);

Есть несколько вариантов решения.Например, вместо пересечения вы можете расширить предложение WHERE с помощью подзапроса IN:

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, которыйэто массив чисел.

...