有幾種查詢模式將返回指定的結果。
一種選擇是使用EXISTS
謂詞與相關子查詢。我認爲這是最容易理解的,儘管對於一大堆價值觀來說這是有點笨拙的;並且很難擴展這種方法來處理「三分之二」類型的查詢。這通常不是表現最好的,其他選項通常表現更好。
與所有這些警告,因爲這種方法的演示,只是追加到現有查詢的問題:
AND EXISTS (SELECT 1 FROM slr_product p1
WHERE p1.seller_id = slr_seller.id
AND p1.name = 'WEIL FELIX TEST*Proteus Antigen OX19, OX2 & OXK'
)
AND EXISTS (SELECT 1 FROM slr_product p2
WHERE p2.seller_id = slr_seller.id
AND p2.name = 'WIDAL TUBE AGGLUTINATION TEST'
)
AND EXISTS (SELECT 1 FROM slr_product p3
WHERE p3.seller_id = slr_seller.id
AND p3.name = 'ZINC, SERUM/PLASMA'
)
也有可能獲得產品的「計數」的列表中賣方,然後過濾。相關的子查詢將爲外部查詢返回的每一行執行,所以這通常也不是最好的執行者,但是這可以擴展爲檢查「2中的2」。只是追加這在問題的現有查詢的末尾:
AND 3 = (SELECT COUNT(DISTINCT p.name)
FROM slr_product p
WHERE p.seller_id = slr_seller.id
AND p.name IN ('WEIL FELIX TEST*Proteus Antigen OX19, OX2 & OXK'
, 'WIDAL TUBE AGGLUTINATION TEST'
, 'ZINC, SERUM/PLASMA'
)
)
我們有時可以通過運行一個子查詢作爲內嵌視圖,返回一組行獲得更好的性能,然後執行JOIN操作那。
SELECT DISTINCT p.seller_id
, p.name
, p.price
, s.name
FROM slr_product p
JOIN slr_seller s
ON s.id = p.seller_id
-- inline view to return seller_id that sell all three products
JOIN (SELECT r.seller_id
FROM slr_product r
WHERE r.name IN ('WEIL FELIX TEST*Proteus Antigen OX19, OX2 & OXK'
, 'WIDAL TUBE AGGLUTINATION TEST'
, 'ZINC, SERUM/PLASMA'
)
GROUP BY r.seller_id
HAVING COUNT(DISTINCT r.name) = 3
) q
-- only return seller_id that sell all three products
ON q.seller_id = p.seller_id
WHERE p.name in ('WEIL FELIX TEST*Proteus Antigen OX19, OX2 & OXK'
, 'WIDAL TUBE AGGLUTINATION TEST'
, 'ZINC, SERUM/PLASMA'
)
是否要添加樣本數據和預期結果? – dotnetom
如果您只想要賣方擁有全部三種產品的結果,您需要做3個子查詢或3個連接,或者一些更復雜的CTE或NOT EXISTS邏輯() –
不,AND不起作用,因爲'name '不能同時有兩個值(禁止不區分大小寫)。 「(A,B,C)中的AND X等價於」AND(X = A或X = B或X = C)「。另外,爲什麼將聯接條件(slr_product.seller_id = slr_seller.id)放在WHERE中而不是在JOINs ON中? – Uueerdo