簡體   English   中英

優化和減小 Union Select Query 的大小

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

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