簡體   English   中英

SQL-在子查詢中根據特定條件選擇

[英]SQL - Select with specific conditions in sub-query

我正在嘗試使用查詢來選擇能夠滿足特定條件的公司的所有數據,但是這樣做很麻煩。 以下是我到目前為止所做的:

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

我希望子查詢(使用下表)的作用是選擇具有service_id 2 4company_id

因此,在此示例中,它將僅返回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來選擇具有service_id 24 company_id

子查詢應為:

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

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

如果您想查看所有公司詳細信息而不是僅查看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)

我為子查詢提供此選項...

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

通常,即使使用非常大的數據集,我也認為這些操作的性能非常出色。

  • 聯盟
  • 相交
  • 除(或Oracle中的減號)

本文有一些不錯的見解:

您可能不使用SQL相交或僅足夠使用

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM