Вернуть все записи для результата подзапроса в sql - PullRequest
0 голосов
/ 17 июня 2020

У меня есть три таблицы: product ,folio_mapping и category. У каждого продукта есть несколько сопоставлений портфолио и несколько категорий. В следующем запросе я хочу получить все категории, к которым принадлежит продукт. Следующий запрос возвращает только ту категорию, для которой выполняется условие. Я хотел бы иметь все категории для продукта, когда условие выполняется.

Я использовал подзапрос в предложении WHERE, он возвращает product_id.

Теперь для этого product_id я хотел бы получить все категории. Есть идеи, что я здесь делаю неправильно.

SELECT  c.category_names
FROM 
    product AS pd
LEFT JOIN
    portfolio_mapping AS p
    ON 
    pd.product_id = p.product_id
LEFT JOIN
    category_mapping AS c
    ON 
    pd.product_id = c.product_id  

WHERE pd.product_id IN
    ( SELECT c.product_id FROM category_mapping AS c 
        WHERE (p.portfolio_mapping_id = 1 AND p.value = 'Yes')  
            AND (c.category_id = 1 AND c.value = 'Yes')  )

1 Ответ

0 голосов
/ 17 июня 2020

Поскольку ваш подзапрос ссылается на строки в основном запросе, вы создаете список IN только для некоторых строк. Вам следует перекодировать предложение where, чтобы добавить все те же объединения.

SELECT  c.category_names
FROM 
    product AS pd
LEFT JOIN
    portfolio_mapping AS p
    ON 
    pd.product_id = p.product_id
LEFT JOIN
    category_mapping AS c
    ON 
    pd.product_id = c.product_id  
WHERE pd.product_id IN
( 
SELECT c1.product_id FROM product AS pd1
JOIN portfolio_mapping AS p1 ON pd1.product_id = p1.product_id
JOIN category_mapping AS c1 ON pd1.product_id = c1.product_id  
WHERE (p1.portfolio_mapping_id = 1 AND p1.value = 'Yes')  
AND (c1.category_id = 1 AND c1.value = 'Yes')  
)

Лично я бы перекодировал его для использования WHERE EXISTS ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...