Использование условия IN в предложении FROM может вызвать у вас горе, поскольку «Условие задает комбинацию из одного или нескольких выражений и логических (логических) операторов и возвращает значение TRUE, FALSEили НЕИЗВЕСТНО. "(см. документация ).Таким образом, конструкция типа (SELECT ...) IN (SELECT ...) - если синтаксически верна - вернет true, false или unknown - что полезно в предложении WHERE (а не в предложении FROM).
В одном из ваших комментариев вы объясняете, что ... "Намерение состоит в том, чтобы показать все продукты, доступные во всех местах."
Использование небольшого набора тестовых данных (см. dbfiddle), охватывающий 5 ваших таблиц, следующий запрос может дать вам отправную точку для поиска решения:
-- Find the store count for each product (table SELLS)
-- and return all product_ids that are available everywhere (STORE_LOCATION count)
select product_id
from (
select
product_id
, count( store_location_id ) store_count
from sells
group by product_id
having count( store_location_id ) = ( select count(*) from store_location )
) ;
-- result
PRODUCT_ID
----------
10
Альтернатива
-- ---------------------------------------------------
-- use analytics -> we don't need GROUP BY and HAVING
-- ---------------------------------------------------
-- 1 count all store_locations (SL)
-- 2 count the amount of stores a product is located in (S)
-- 3 JOIN the 2 result sets (equijoin)
-- 4 return the product_id found
-- NOTE: we are working with Oracle -> don't use AS when defining table aliases (AS can be used for column aliases)
select product_id -- 4
from (
select count(*) store_count from store_location -- 1
) SL join (
select unique
product_id
, count( store_location_id ) over ( partition by product_id ) store_count -- 2
from sells
) S on SL.store_count = S.store_count -- 3
;
-- result
PRODUCT_ID
----------
10
Как только вы получите правильный product_id(s), вы можете "закрепить" оставшиеся таблицы, необходимые для вашего запроса (используя JOIN), и записать все необходимые имена столбцов (включая псевдонимы таблиц) в SELECT.Например,
select
S.product_id
, P.product_name
, SZ.size_option
from (
select count(*) store_count from store_location
) SL join (
select unique
product_id
, count( store_location_id ) over ( partition by product_id ) store_count
from sells
) S on SL.store_count = S.store_count
join product P on S.product_id = P.product_id
join available_in AI on AI.product_id = P.product_id
join sizes SZ on AI.sizes_id = SZ.sizes_id
;
-- result
PRODUCT_ID PRODUCT_N SIZE_OP
---------- --------- -------
10 product10 option1
10 product10 option2