sql中with
『壹』 sql:with 查詢
WITH 提供了一種方式來書寫在一個大型查詢中使用的輔助語句。
這些語句通常被稱為公共表表達式 或 CTE ,它們可以被看成是僅在單個 SQL 語句( SELECT 、 INSERT 、 UPDATE 或 DELETE )的執行范圍內存在中存在的臨時表。
在 WITH 子句中的每一個輔助語句可以是一個 SELECT 、 INSERT 、 UPDATE 或 DELETE ,並且 WITH 子句本身也可以被附加到一個主語句,主語句也可以是 SELECT 、 INSERT 、 UPDATE 或 DELETE 。
在合並兩張表之前先進行篩選,盡可能刪減掉不需要的行,只保留需要的行,這樣編寫出的 SQL 更高效。
以下的 SQL 是非常低效的,因為它先合並兩個表,之後才對 「2017 年 1 月 9 日」 之後的時間進行篩選:
正確的表達方式是在合並表之前使用CTEs進行篩選,如下:
比如 table_a 和 table_b 各有 1000 條數據, day >= '2017-09-01' 的數據為 10 條。
正常人都知道,100 條數據處理比 100w 條數據處理塊,所以【先過濾再連表】比【先連表再過濾】效率更高。
『貳』 SQL 中with的用法
SQL 中with的用法如下:
CTE 之後必須跟隨引用部分或全部 CTE 列的 SELECT、INSERT、UPDATE 或 DELETE 語句。也可以在 CREATE VIEW 語句中將 CTE 指定為視圖中 SELECT 定義語句的一部分。
可以在非遞歸 CTE 中定義多個 CTE 查詢定義。定義必須與以下集合運算符之一結合使用:UNION ALL、UNION、INTERSECT 或 EXCEPT。
CTE 可以引用自身,也可以引用在同一WITH子句中預先定義的 CTE。不允許前向引用。
不允許在一個 CTE 中指定多個WITH子句。例如,如果 CTE_query_definition 包含一個子查詢,則該子查詢不能包括定義另一個 CTE 的嵌套的WITH子句。
不能在 CTE_query_definition 中使用以下子句:
COMPUTE 或 COMPUTE BY
ORDER BY(除非指定了 TOP 子句)
INTO
帶有查詢提示的 OPTION 子句
FOR XML
FOR BROWSE
(2)sql中with擴展閱讀
定義和使用遞歸 CTE 指南
下列指南適用於定義遞歸 CTE 的情況:
遞歸 CTE 定義至少必須包含兩個 CTE 查詢定義,一個定位點成員和一個遞歸成員。可以定義多個定位點成員和遞歸成員;但必須將所有定位點成員查詢定義置於第一個遞歸成員定義之前。所有 CTE 查詢定義都是定位點成員,但它們引用 CTE 本身時除外。
定位點成員必須與以下集合運算符之一結合使用:UNION ALL、UNION、INTERSECT 或 EXCEPT。在最後一個定位點成員和第一個遞歸成員之間,以及組合多個遞歸成員時,只能使用 UNION ALL 集合運算符。
定位點成員和遞歸成員中的列數必須一致。
遞歸成員中列的數據類型必須與定位點成員中相應列的數據類型一致。
遞歸成員的 FROM 子句只能引用一次 CTE expression_name。
在遞歸成員的 CTE_query_definition 中不允許出現下列項:
『叄』 下面SQL 中的;with 是什麼意思,為什麼一定要加上':with'呢,起什麼作用呢。
SQL 語句裡面的 with
是使用在 CTE 上面的
CTE(Common Table Expression) ,即公用表表達式,可以認為是在單個 SELECT、INSERT、UPDATE、DELETE 或 CREATE ⅥEW 語句的執行范圍內定義的臨時結果集。CTE 與派生表類似,具體表現在不存儲為對象,並且只在查詢期間有效。與派生表的不同之處在於,CTE 可自引用,還可在同一查詢中引用多次。
『肆』 SQL SERVER裡面的with語句有什麼作用用過的師兄請幫忙
with 是公用表表達式(CTE),它是一個在查詢中定義的臨時命名結果集將在from子句中使用它。每個CTE僅被定義一次(但在其作用域內可以被引用任意次),並且在該查詢生存期間將一直生存。可以使用CTE來執行遞歸操作。
with 自己起的名字 as
(
select * from 表名
)
select * from 自己起的名字