[英]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
和 4
的company_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
2
和4
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
通常,即使使用非常大的數據集,我也認為這些操作的性能非常出色。
本文有一些不錯的見解:
希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.