[英]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_type
與cost_type
表記錄匹配且cost_year
為2018
所有記錄。 最重要的是,我必須申報status
為Y
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.