簡體   English   中英

SQL中子查詢的替代方法?

[英]Alternative for sub-query in SQL?

我有應該返回一些列結果的查詢。 還有一個要求,我必須對其中一列應用其他過濾器。 我發現使用子查詢(在主選擇內選擇)的解決方案是示例:

SELECT 
   recid,
   price,
   receive_date,
   (SELECT deduction FROM Cost WHERE recid = c.recid AND status = 'Y') AS deduction
FROM Cost c
   INNER JOIN cost_types ct
      c.recid = ct.recid
WHERE cost_year = '2018'

上面的查詢必須從Cost表中cost_typecost_type表記錄匹配且cost_year2018所有記錄。 最重要的是,我必須申報statusY deduction 我想知道我可以使用什么其他技術進行此查詢? 我知道UNION / UNION ALL但這是更多代碼,似乎很多余。 如果有人有建議或更好的方法來解決這種情況,請告訴我。 另外,我想知道這是否更適合存儲過程? 會推薦嗎?

JOIN是正常的方法,如下所示:

SELECT c.recid, c.price, c.receive_date,
       cd.deduction
FROM cost c INNER JOIN
     cost_types ct
     ON c.recid = ct.recid LEFT JOIN
     cost cd
     ON cd.recid = c.recid AND cd.status = 'Y'
WHERE c.cost_year = 2018;

這是在猜測列的來源。 如果這些列來自不同的表,請調整限定詞。

您可能還可以使用窗口函數:

SELECT c.recid, c.price, c.receive_date,
       SUM(CASE WHEN c.status = 'Y' THEN c.deduction END) OVER (PARTITION BY c.recid) as deduction
FROM cost c INNER JOIN
     cost_types ct
     ON c.recid = ct.recid 
WHERE c.cost_year = 2018;

為什么不簡單使用CASE

SELECT recid, price, receive_date,
      (CASE WHEN status = 'Y' THEN deduction END) AS deduction
FROM Cost c INNER JOIN 
     cost_types ct
     ON c.recid = ct.recid 
WHERE cost_year =  2018;

編輯:我懷疑你想要一些東西:

SELECT recid, price, receive_date, c1.deduction 
FROM Cost c INNER JOIN 
     cost_types ct
     ON c.recid = ct.recid OUTER APPLY 
     (SELECT TOP (1) c1.*
      FROM  Cost c1
      WHERE c1.recid = c.recid AND c1.status = 'Y'
      ORDER BY ?? -- Use ordering column based on you want deduction 
     ) c1;
WHERE cost_year =  2018;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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