SQL-在子查询中根据特定条件选择

时间:2018-12-19 15:06:37

标签: sql postgresql

我正在尝试使用查询来选择能够满足特定条件的公司的所有数据,但是这样做很麻烦。以下是我到目前为止所做的:

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 <{> / strong> 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,而且还会选择{{1} } 5。 我了解为什么存在company_id来检查一个值是否与值列表中的任何值匹配,所以这并不是我真正需要的。

所以我的问题是:

  

如何替换子查询中的3以选择IN   拥有IN company_idservice_id

4 个答案:

答案 0 :(得分:4)

子查询应为:

 SELECT b.company_id 
 FROM provider b 
 WHERE b.service_id IN (2, 4)
 GROUP BY  b.company_id 
 HAVING COUNT(b.service) = 2

答案 1 :(得分:0)

您可以自我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

答案 2 :(得分:0)

如果您想查看所有公司详细信息而不是仅查看Company_id,那么其他答案也是正确的,您可以为每个service_id使用两个EXISTS()

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)

答案 3 :(得分:0)

我为子查询提供此选项...

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

通常,我发现即使在数据集非常大的情况下,这些操作的性能也很出色...

  • 联盟
  • 相交
  • EXCEPT(或Oracle中的MINUS)

本文有一些很好的见解:

You Probably Don't Use SQL Intersect or Except Often Enough

希望有帮助。