POSTGRESQL - Запрос не возвращает нужные мне данные - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь выполнить следующий запрос

SELECT *
FROM 
    companies
 WHERE
    companies.id IN (
    SELECT
        product_stocks.company_id
    FROM
        product_stocks
    WHERE 
        product_stocks.product_id = 1
    AND
        product_stocks.product_id = 9
  )

Этот запрос ничего не возвращает. Я хотел бы, чтобы этот запрос возвращал только компании, если у вас есть 2 продукта (идентификаторы 1 и 9). И есть компании с этими условиями в базе данных. Я также пытался с IN, но он возвращает все компании, которые имеют идентификатор 1 или идентификатор 9, и это не работает. Кто-нибудь знает способ заставить этот запрос работать?

Ответы [ 3 ]

0 голосов
/ 25 февраля 2020

Похоже, вы ищете, где строки EXIST "запрос, чтобы вернуть только компании, если у вас есть 2 продукта (идентификаторы 1 и 9):

select *
  from companies c
 where exists (select null 
                 from product_stocks ps1 
                where c.company_id = ps1.company_id 
                  and ps1.product_id = 1
              )
   and exists (select null 
                 from product_stocks ps9 
                where c.company_id = ps9.company_id 
                  and ps9.product_id = 9
              );           
0 голосов
/ 25 февраля 2020

Ваш запрос не возвращает записей, просто потому, что ни одна запись в product_stocks не может иметь product_id 1 и 9 одновременно. Если вы хотите использовать дополнительный выбор, чтобы ограничить идентификаторы компании, то один из способов сделать это так:

SELECT * FROM companies WHERE companies.id IN ( SELECT ps1.company_id FROM product_stocks ps1 INNER JOIN product_stocks ps9 ON ps1.company_id = ps9.company_id WHERE ps1.product_id = 1 AND ps9.product_id = 9)

В порядке пояснения, внутреннее (само) соединение в подпункте выбора гарантируется, что будут возвращены только идентификаторы компаний, которые имеют оба product_ids 1 и 9.

0 голосов
/ 25 февраля 2020

Вы должны использовать «ИЛИ» вместо «И».

SELECT *
FROM 
    companies
 WHERE
    companies.id IN (
    SELECT
        product_stocks.company_id
    FROM
        product_stocks
    WHERE 
        product_stocks.product_id = 1
    OR
        product_stocks.product_id = 9
  )

ИЛИ

SELECT *
FROM 
    companies
 WHERE
    companies.id IN (
    SELECT
        product_stocks.company_id
    FROM
        product_stocks
    WHERE 
        product_stocks.product_id IN (1,9)
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...