簡體   English   中英

如何避免將多個子查詢作為表達式(SQL優化)

[英]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.

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