簡體   English   中英

在SQL Server中使用CTE而不是子查詢

[英]Use CTE instead of Subquery in SQL Server

我有以下查詢,它的工作原理足夠好,但有人告訴我,使用CTE比使用大型子查詢更好。 我對這個概念CONVERT ,並嘗試通過從CASE語句到SELECT列表中的最后一個CONVERT所有內容CASE起作用,但是我沒有運氣。 有什么技巧可以幫助嘗試使用CTE而不是子查詢的人嗎? 我需要使用子查詢的原因是我需要將CASE語句中的日期與其他別名日期之一進行比較,並且不能在WHERE

謝謝。

SQL:

USE PDX_SAP_USER
GO

SELECT *
FROM (
    SELECT E.team_member_name [EMPLOYEE], K.business_segment_desc [BUSINESS SEGMENT], G.order_status [GPS ORDER STATUS], H.po_type [PO TYPE], G.order_no [GPS ORDER NO], I.po_number [SAP PO NUMBER], I.shipping_instruct [SAP SHIP MODE], G.shipping_type [GPS SHIP MODE], CASE 
            WHEN I.shipping_instruct LIKE 'A%'
                THEN CONVERT(VARCHAR(12), (I.revised_ex_factory + 10), 101)
            WHEN I.shipping_instruct LIKE 'C%'
                THEN CONVERT(VARCHAR(12), (I.revised_ex_factory + 5), 101)
            END [DESIRED TRANSIT DATE], CONVERT(VARCHAR(12), I.revised_ex_factory, 101) [LAST CONFIRMED DATE ], CONVERT(VARCHAR(12), S.po_estimated_deliv_date, 101) [CURRENT DELIV DATE],
        -- 'days_diff'
        I.material [MATERIAL], M.description [DESCRIPTION], I.stock_category [STOCK CATEGORY], I.po_ordered_quantity [PO ORDERED QUANTITY], I.po_recvd_quantity [PO RECVD QUANTITY], I.po_balance_quantity [PO BALANCE QUANTITY], I.po_intransit_quantity [PO INTRANSIT QUANTITY], I.plant_code [PLANT], I.direct_ship_code [DS CODE], I.comment [COMMENT]
    FROM (
        SELECT order_no, order_status, shipping_type
        FROM asagdwpdx_prod.dbo.SimoxOrder1

        UNION ALL

        SELECT order_no, order_status, shipping_type
        FROM asagdwpdx_prod.dbo.SimoxOrder2

        UNION ALL

        SELECT order_no, order_status, shipping_type
        FROM asagdwpdx_prod.dbo.SimoxOrder3
        ) G
    INNER JOIN pdx_sap_user..vw_po_header H ON G.order_no = H.ahag_number
    INNER JOIN pdx_sap_user..vw_po_item I ON H.po_number = I.po_number
    INNER JOIN pdx_sap_user..vw_po_size S ON I.po_number = S.po_number
        AND I.po_item_number = S.po_item_number
    INNER JOIN pdx_sap_user..vw_mm_material M ON I.material = M.material
    INNER JOIN pdx_sap_user..vw_kd_business_segment K ON M.business_segment_code = K.business_segment_code
    INNER JOIN adi_user_maintained..scm_po_employee_name E ON I.po_number = E.po_number
    WHERE I.po_balance_quantity > 0
        AND I.del_indicator NOT IN ('L', 'S')
        AND H.PO_TYPE NOT IN ('01', 'UB')
        AND I.shipping_instruct IN ('A1', 'A2', 'A5', 'C1', 'C2', 'C3')
        AND G.order_status = '40'
    ) q1
WHERE q1.[DESIRED TRANSIT DATE] <> q1.[CURRENT DELIV DATE]
ORDER BY q1.[SAP PO NUMBER]

派生表和CTE之間的唯一區別(當然不是語法)是CTE允許您編寫自引用的遞歸查詢(也稱為遞歸CTE)。 有時提前將內容抽象到CTE中會更干凈,但這只是優先事項,而不是性能問題。 就我個人而言,我傾向於使用CTE來抽象大的丑陋查詢,但是對於一個相對於另一個而言,並沒有什么強有力的論據。

舉一個簡單的例子,這兩個語句在功能上是相同的

 --- using a CTE
;with numbers as
(
    select top 10 num = row_number() over (order by (select null))
    from sys.all_objects
)
select *
from numbers    

 -- Using a derived table
select *
from
(
    select top 10 num = row_number() over (order by (select null))
    from sys.all_objects
) a

暫無
暫無

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

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