Подзапрос в FROM не работает в Oracle SQL - PullRequest
0 голосов
/ 05 октября 2018

Я работаю над преобразованием запроса из подзапроса в разделе WHERE в раздел FROM.

Насколько я понимаю, предложение FROM вернет таблицу, которую я называю "product_locations", и тогда мой внешний запрос сможет извлечь информацию из этой таблицы.Я не могу видеть, работает ли внешний запрос в этот момент, потому что я застреваю на ошибке, что я пропускаю правильные скобки.На данный момент, я думаю, что моя главная проблема не в том, чтобы понять, как правильно определить две части предложения IN, которые составляют подзапрос.

Вот исходный запрос:

SELECT size_option, 
       product.product_name
FROM   sizes
JOIN   available_in ON sizes.sized_id = available_in.sizes_id
JOIN   product ON product.product_id = available_in.product_id
WHERE (SELECT COUNT (store_name)
       FROM store_location IN (SELECT COUNT (store_location_id)
       FROM sells
       JOIN product ON sells.product_id = product.product_id
       GROUP BY sells.store_location)

Я пытаюсь выполнить запрос:

SELECT size_option, 
       product_location.product_name 
FROM   (SELECT COUNT(store_name)
       FROM   store_location) IN (SELECT COUNT (store_location_id)
       FROM sells
       JOIN product ON sells.product_id = product.product_id
GROUP BY sells.store_location_id) product_location
JOIN   sizes ON sizes.size_option = product_location.size_option
JOIN   available_in ON sizes.sizes_id = available_in.sizes_id
JOIN   product ON product.product_id = available_in.product_id

и получаю ошибку:

SELECT size_option, 
       product_location.product_name 
FROM   (SELECT COUNT(store_name)
       FROM   store_location) IN (SELECT COUNT (store_location_id)
       FROM sells
       JOIN product ON sells.product_id = product.product_id
GROUP BY sells.store_location_id) product_location
JOIN   sizes ON sizes.size_option = product_location.size_option
JOIN   available_in ON sizes.sizes_id = available_in.sizes_id
JOIN   product ON product.product_id = available_in.product_id
Error at Command Line : 4 Column : 31
Error report -
SQL Error: ORA-00933: SQL command not properly ended
00933. 00000 -  "SQL command not properly ended"
*Cause:    
*Action:

Вот изображение ошибки в моем редакторе picture of the error

Вот ERD enter image description here

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Согласно ОП в комментариях: Цель состоит в том, чтобы показать все продукты, доступные во всех местоположениях.

Рассмотреть возможность объединения двух таблиц, полученных из совокупного запроса (или подзапросов в FROM илиJOIN предложение):

  1. тот, который подсчитывает магазины по определенному товару
  2. тот, который подсчитывает магазины по всем продуктам

Затем присоединитесь к подзапросам с помощью соответствующих product_id и store_count value.Обязательно используйте псевдонимы таблиц для удобства чтения.

SELECT s.size_option, 
       p.product_name
FROM   sizes AS s
JOIN   available_in AS a ON s.sized_id = a.sizes_id
JOIN   product AS p ON p.product_id = a.product_id
JOIN  
      --- STORE COUNT BY PRODUCT
      (
       SELECT sub_p.product_id, COUNT(sl.store_location_id) AS store_count
       FROM sells AS sl
       JOIN product AS sub_p ON sl.product_id = sub_p.product_id
       GROUP BY sub_p.product_id
      ) AS agg_p 
  ON agg_p.product_id = p.product_id

JOIN  
      --- STORE COUNT ACROSS ALL PRODUCTS
      (
       SELECT COUNT(sl.store_location_id) AS store_count
       FROM sells AS sl
       JOIN product AS sub_p ON sl.product_id = sub_p.product_id
      ) AS agg_s 
  ON agg_s.store_count = agg_p.store_count
0 голосов
/ 07 октября 2018

Использование условия 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
0 голосов
/ 05 октября 2018

ваш запрос может показаться ниже

SELECT size_option, 
       product_location.product_name,
      (
       SELECT COUNT(store_name)
       FROM   store_location
       )  as store_name_cnt,
       (
       SELECT COUNT (store_location_id)
       FROM sells
       JOIN product ON sells.product_id = product.product_id
    GROUP BY sells.store_location_id
     ) as location_count
    from product_location
JOIN   sizes ON sizes.size_option = product_location.size_option
JOIN   available_in ON sizes.sizes_id = available_in.sizes_id

ошибка вашего запроса

SELECT size_option, 
       product_location.product_name 
FROM   (SELECT COUNT(store_name) --invalid from 
       FROM   store_location) 
      IN (SELECT COUNT (store_location_id) -- there is no where but you use in
       FROM sells
       JOIN product ON sells.product_id = product.product_id
GROUP BY sells.store_location_id) product_location -- inconsistent table alias
JOIN   sizes ON sizes.size_option = product_location.size_option
JOIN   available_in ON sizes.sizes_id = available_in.sizes_id
JOIN   product ON product.product_id = available_in.product_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...