假設我們有一個provider_service表,用於存儲提供商提供的所有服務。查詢查找所有提供所有服務的提供商
Provider_Service表:ProviderID | ServiceId
然後我們有一個table_valued參數@idServices與服務列表。
我需要查詢SQLSERVER才能找到提供表值參數中指定的所有服務的所有提供程序。
假設我們有一個provider_service表,用於存儲提供商提供的所有服務。查詢查找所有提供所有服務的提供商
Provider_Service表:ProviderID | ServiceId
然後我們有一個table_valued參數@idServices與服務列表。
我需要查詢SQLSERVER才能找到提供表值參數中指定的所有服務的所有提供程序。
SELECT ps.ProviderID
FROM Provider_Service ps
INNER JOIN @idServices i
ON ps.ServiceId = i.ServiceId
GROUP BY ps.ProviderID
HAVING COUNT(DISTINCT ps.ServiceId) = (SELECT COUNT(*) FROM @idServices)
SELECT ps.*
FROM Provider_Service ps
INNER JOIN @idServices s ON s.ServiceId = ps.ServiceId
假設我理解你的問題,並假設在TVP領域是SERVICEID,它只是兩個
SELECT
*
FROM
Provider_Service PS
INNER JOIN
@idServices IS
ON IS.ServiceId = PS.ServiceId
一個解決方案之間的內部連接是雙重否定:所有提供的這不存在不由該提供商提供服務的服務。在SQL中:
select distinct ps1.ProviderID
from Provider_Service ps1
where not exists
(
select *
from @idServices is
where not exists
(
select *
from Provider_Service ps2
where ps2.ProviderID = ps1.ProviderID
ps2.ServiceId = is.ServiceID
)
)
謝謝,這就是我一直在尋找的。 (在我的情況下,我不需要DISTINCT,因爲ProviderID,ServiceID是唯一鍵) – Alfz
爲什麼我們需要'HAVING ...'這裏?不能得到這一點 – sll
@sil'HAVING'保證*表值參數中的所有*服務都可以在主表中找到。 –