SQL - выберите с конкретными условиями в подзапросе - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь использовать запрос, чтобы выбрать все данные компании, которая отвечает определенному условию, но у меня возникают проблемы при этом.Следующее - то, что я сделал до сих пор:

SELECT *
  FROM company a
 WHERE a.id IN (SELECT b.company_id 
                  FROM provider b 
                 WHERE b.service_id IN (2, 4));

То, что я предполагаю для роли подзапроса (используя таблицу ниже), состоит в том, чтобы выбрать company_id, который обладает service_id 2 и 4.

Таким образом, в этом примере будет возвращено только company_id 5:

+----------------+
| provider TABLE |
+----------------+

+----------------+----------------+----------------+
|       id       |   company_id   |   service_id   |
+--------------------------------------------------+
|        1       |        3       |        2       |
|        2       |        5       |        2       |
|        3       |        5       |        4       |
|        4       |        9       |        6       |
|        5       |        9       |        7       |
|       ...      |       ...      |       ...      |

Как вывозможно, предположил, что использование IN в подзапросе не удовлетворяет моим потребностям, оно выберет company_id 5, но также company_id 3.Я понимаю, почему IN существует, чтобы проверить, соответствует ли значение какому-либо значению в списке значений, поэтому это не совсем то, что мне нужно.

Итак, мой вопрос:

Как заменить IN в моем подзапросе, чтобы выбрать company_id с service_id 2 и 4?

Ответы [ 4 ]

0 голосов
/ 19 декабря 2018

Я предлагаю эту опцию для подзапроса ...

SELECT b.company_id 
  FROM provider b WHERE b.service_id = 2
INTERSECT
SELECT b.company_id 
  FROM provider b WHERE b.service_id = 4

Часто я считаю производительность этих операций выдающейся даже при очень больших наборах данных ...

  • UNION
  • INTERSECT
  • ИСКЛЮЧИТЬ (или МИНУС в Oracle)

Эта статья имеет несколько хороших идей:

Вы, вероятно,Не используйте SQL Intersect или за исключением случаев, когда достаточно

Надеюсь, это поможет.

0 голосов
/ 19 декабря 2018

Вы можете самостоятельно - JOIN просмотреть таблицу поставщиков, чтобы найти компании, которым принадлежат обе необходимые услуги.

SELECT p1.company_id
FROM provider p1
INNER JOIN provider p2 on p2.company_id = p1.company_id and p2.service_id = 2
WHERE p1.service_id = 4
0 голосов
/ 19 декабря 2018

Также как и другие ответы верны, если вы хотите видеть все детали компании, а не только Company_id, вы можете использовать два EXISTS() для каждого service_id.

SELECT *
FROM Company C 
WHERE EXISTS (SELECT 1 
              FROM Provider P1 
              WHERE C.company_id = P1.company_id 
              AND P1.service_id = 2)
  AND EXISTS (SELECT 1 
              FROM Provider P2 
              WHERE C.company_id = P2.company_id 
              AND P2.service_id = 4)
0 голосов
/ 19 декабря 2018

Подзапрос должен быть:

 SELECT b.company_id 
 FROM provider b 
 WHERE b.service_id IN (2, 4)
 GROUP BY  b.company_id 
 HAVING COUNT(b.service) = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...