[英]Use CTE instead of Subquery in SQL Server
I have the below query and it works well enough but I have been told that using CTE
is a better route than a giant subquery. 我有以下查询,它的工作原理足够好,但有人告诉我,使用CTE
比使用大型子查询更好。 I am pretty new to the concept and have tried to get this to work by pulling out everything from the CASE
statement to the last CONVERT
in the SELECT
list but I have had no luck. 我对这个概念CONVERT
,并尝试通过从CASE
语句到SELECT
列表中的最后一个CONVERT
所有内容CASE
起作用,但是我没有运气。 Are there any tips for somebody trying to use CTE
instead of subqueries? 有什么技巧可以帮助尝试使用CTE
而不是子查询的人吗? The reason I needed to use a subquery is that I needed to compare the dates from the CASE
statement with one of the other alias dates and cannot in WHERE
我需要使用子查询的原因是我需要将CASE
语句中的日期与其他别名日期之一进行比较,并且不能在WHERE
Thanks. 谢谢。
SQL: 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]
The only difference between a derived table and a CTE (other than the syntax of course) is that a CTE allows you to write recursive queries which self reference (aka Recursive CTE). 派生表和CTE之间的唯一区别(当然不是语法)是CTE允许您编写自引用的递归查询(也称为递归CTE)。 It is sometimes cleaner to abstract things into a CTE ahead of time, but it's just a matter of preference, not a performance matter. 有时提前将内容抽象到CTE中会更干净,但这只是优先事项,而不是性能问题。 Personally I tend to be a fan of using CTEs to abstract big ugly queries, but there's not really a strong argument for one over the other. 就我个人而言,我倾向于使用CTE来抽象大的丑陋查询,但是对于一个相对于另一个而言,并没有什么强有力的论据。
By way of a trivial example, these two statements are functionally identical 举一个简单的例子,这两个语句在功能上是相同的
--- 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.