[英]Optimize and reduce size of Union Select Query
我的問題是關於如何優化和減少 sql 查詢的大小。 我想使用 UNION 加入 20 多個多個查詢,它根據以下邏輯給了我正確的結果,但我在這里尋找兩件事
更有效的東西
我的查詢中已經有 20 個聯合,每個月我必須添加 2-4 個聯合,這使得這個查詢很長,所以有什么辦法可以用更少的代碼重新表述這個查詢
Select '343' As 'Manual ID', '24/07/2020' As 'Date', A.ID, O.Order_Name, C.Customer_Name, Q.Quantity From Shipper A Left Join Order O A.ID = O.ID Left Join Customer C A.ID = C.ID Left Join Quantity Q Q.ID = C.ID where A.ID IN (1) UNION Select '323' As 'Manual ID', '24/08/2020' As 'Date', A.ID, O.Order_Name, C.Customer_Name, Q.Quantity From Shipper A Left Join Order O A.ID = O.ID Left Join Customer C A.ID = C.ID Left Join Quantity Q Q.ID = C.ID where A.ID IN(2,3,4)
等等 ...
結果
Manual ID | Date | Shipper | Order Name | Customer Name | Qty
343 | 24/07/2020 | 1 | order1 | A | 5
323 | 24/08/2020 | 2 | order2 | B | 2
323 | 24/08/2020 | 3 | order3 | C | 1
323 | 24/08/2020 | 4 | order4 | D | 12
你可以試試這個:
Select
CASE
WHEN A.ID IN(1) THEN '343'
WHEN A.ID IN(2,3,4) THEN '323'
END As 'Manual ID',
CASE
WHEN A.ID IN(1) THEN '24/07/2020'
WHEN A.ID IN(2,3,4) THEN '24/08/2020'
END As 'Date',
A.ID,
O.Order_Name,
C.Customer_Name,
Q.Quantity
From Shipper A
Left Join Order O A.ID = O.ID
Left Join Customer C A.ID = C.ID
Left Join Quantity Q Q.ID = C.ID
Where A.ID IN(1,2,3,4)
第一個建議是將參數移動到另一個表中,然后加入它。 如果您不想使用真正的表格,您甚至可以將其設為內聯視圖...
第二個建議是使用 UNION ALL 來避免 UNION 產生的重復數據刪除成本。
SELECT
params.*,
O.Order_Name,
C.Customer_Name,
Q.Quantity
FROM
(
SELECT '343' As 'Manual ID', '24/07/2020' As 'Date', 1 AS A_ID
UNION ALL SELECT '323' As 'Manual ID', '24/08/2020' As 'Date', 2 AS A_ID
UNION ALL SELECT '323' As 'Manual ID', '24/08/2020' As 'Date', 3 AS A_ID
UNION ALL SELECT '323' As 'Manual ID', '24/08/2020' As 'Date', 4 AS A_ID
)
AS params
INNER JOIN Shipper A ON A.ID = params.A_ID
Left Join Order O ON A.ID = O.ID
Left Join Customer C ON C A.ID = C.ID
Left Join Quantity Q ON Q.ID = C.ID
或者,不要每個月重新計算一次。 每個月寫一個新查詢,並將結果插入另一個表?
如果您只想進行查詢,更好的方法是使用 case when 語句,但您需要時不時地更新查詢以添加新案例。
另一個優化的解決方案是創建一個新表來存儲發貨人(表)中的Manual ID, Date, (Common) ID
。 然后創建一個視圖,將上面的所有表與新表連接起來。
新表
Manual ID | Date | ID |
343 | 24/07/2020 | 1 |
323 | 24/08/2020 | 2 |
323 | 24/08/2020 | 3 |
323 | 24/08/2020 | 4 |
然后創建一個連接所有表的視圖,包括帶有ID 的新表。
在這種情況下,您只需要向新表添加新值,您就可以自行查看結果。
CREATE VIEW MY_VIEW
AS
SELECT * FROM
(
Select
T.[Manual ID],
T.[Date],
A.ID,
O.Order_Name,
C.Customer_Name,
Q.Quantity
From Shipper A
Left Join Order O A.ID = O.ID
Left Join Customer C A.ID = C.ID
Left Join Quantity Q Q.ID = C.ID
Left Join NewTable T T.ID = A.ID
)
現在只需在新表中插入值並從 MY_VIEW 中獲取完整數據。 它會給出與您例外的結果相同的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.