[英]How to avoid multiple subquery as expression (SQL optimization)
我有兩個表A
user_id external_party_id
1 6
表B
user_id activated user_mode sale_mode
1 false 'Customer' 'Web'
1 true 'Customer' 'Local'
1 true 'Partner' 'Web'
1 true 'Partner' 'Local'
結果
user_id external_party_id customer_web customer_local partner_web partner_local
1 6 false true true true
2 7 false false true false
現在我有以下這種查詢
SELECT
u.*,
(SELECT activated
FROM TABLE_B
WHERE user_id = u.user_id AND user_mode = 'Customer' AND sale_mode = 'Web'
) AS customer_web,
(SELECT activated
FROM TABLE_B
WHERE user_id = u.user_id AND user_mode = 'Customer' AND sale_mode = 'Local'
) AS customer_local,
(SELECT activated
FROM TABLE_B
WHERE user_id = u.user_id AND user_mode = 'Partner' AND sale_mode = 'Web'
) AS partner_web,
(SELECT activated
FROM TABLE_B
WHERE user_id = u.user_id AND user_mode = 'Partner' AND sale_mode = 'Local'
) AS partner_local,
FROM TABLE_A AS u;
我想知道是否有更好的方法來實現這一目標。 此查詢是否嘗試四次查詢TABLE_B以填充每個列值?
使用條件聚合
SELECT
u.user_id,u.external_party_id,
MAX (CASE WHEN user_mode = 'Customer' AND sale_mode = 'Web' THEN activated END) AS customer_web,
MAX (CASE WHEN user_mode = 'Customer' AND sale_mode = 'Local' THEN activated END) AS customer_local,
MAX (CASE WHEN user_mode = 'Partner' AND sale_mode = 'Web' THEN activated END) AS partner_web,
MAX (CASE WHEN user_mode = 'Partner' AND sale_mode = 'Local' THEN activated END) AS partner_local
FROM TABLE_A AS u
LEFT JOIN TABLE_B b ON b.user_id = u.user_id
GROUP BY u.user_id,u.external_party_id
格式不完全相同,但是您可以使用直接左連接將其改寫為:
SELECT
a.*,
b.activated,
b.user_mode,
b.sales_mode
FROM TABLE_A AS a
LEFT JOIN TABLE_B AS b
ON a.user_id = b.user_id AND
user_mode IN ('Customer', 'Partner') AND
sale_mode IN ('Web', 'Local');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.