คำถามติดแท็ก common-table-expression

Common Table Expression (CTE) คือชุดผลลัพธ์ชั่วคราวที่กำหนดไว้ภายในขอบเขตการดำเนินการของคำสั่ง SELECT, INSERT, UPDATE, DELETE หรือ CREATE VIEW เดียว

9
เมื่อใดจึงควรใช้ Common Table Expression (CTE)
ฉันเริ่มอ่านเกี่ยวกับCommon Table Expressionและไม่สามารถนึกถึงกรณีการใช้งานที่ฉันจะต้องใช้ พวกเขาดูเหมือนจะซ้ำซ้อนเหมือนกันสามารถทำได้ด้วยตารางที่ได้รับ มีบางอย่างที่ฉันขาดหายไปหรือไม่เข้าใจใช่ไหม ใครสามารถให้ตัวอย่างง่ายๆของข้อ จำกัด กับแบบสอบถามแบบธรรมดา, มาหรือ temp ตารางเพื่อให้กรณีของ CTE? ตัวอย่างง่ายๆใด ๆ ที่จะได้รับการชื่นชมอย่างมาก

4
มีความแตกต่างด้านประสิทธิภาพระหว่าง CTE, Sub-Query, Temporary Table หรือ Table Variable หรือไม่?
ในคำถาม SO ที่ยอดเยี่ยมนี้ความแตกต่างระหว่างCTEและsub-queriesถูกกล่าวถึง ฉันต้องการถามเฉพาะ: แต่ละเหตุการณ์ต่อไปนี้มีประสิทธิภาพมากขึ้น / เร็วขึ้นในสถานการณ์ใด CTE แบบสอบถามย่อย ตารางชั่วคราว ตัวแปรตาราง ตามเนื้อผ้าฉันได้ใช้ความพยายามอย่างมากtemp tablesในการพัฒนาstored proceduresเนื่องจากดูเหมือนว่าจะสามารถอ่านได้มากกว่าแบบสอบถามย่อยแบบพัน Non-recursive CTEสรุปชุดข้อมูลได้ดีมากและอ่านได้มาก แต่มีสถานการณ์เฉพาะที่ใคร ๆ สามารถพูดได้ว่าพวกเขาจะทำงานได้ดีขึ้นหรือไม่ หรือว่าเป็นกรณีที่ต้องทำตัวตาม ๆ ตัวเลือกต่าง ๆ เพื่อหาทางออกที่มีประสิทธิภาพที่สุด? แก้ไข ฉันเพิ่งได้รับแจ้งว่าในแง่ของประสิทธิภาพตารางชั่วคราวเป็นตัวเลือกแรกที่ดีเนื่องจากมีฮิสโตแกรมที่เกี่ยวข้องเช่นสถิติ

7
คุณสามารถสร้างคำสั่งซ้อนด้วย Common สำหรับนิพจน์ตารางทั่วไปได้หรือไม่
WITH y AS ( WITH x AS ( SELECT * FROM MyTable ) SELECT * FROM x ) SELECT * FROM y สิ่งที่ชอบงานนี้หรือไม่? ฉันลองก่อนหน้านี้ แต่ไม่สามารถใช้งานได้

6
วิธีการสร้างตาราง Temp พร้อม SELECT * INTO tempTable จาก CTE Query
ฉันมีคิวรี่ MS SQL CTE ซึ่งฉันต้องการสร้างตารางชั่วคราว ฉันไม่แน่ใจว่าจะทำอย่างไรเพราะจะทำให้เกิดInvalid Object nameข้อผิดพลาด ด้านล่างนี้เป็นข้อความค้นหาทั้งหมดสำหรับการอ้างอิง SELECT * INTO TEMPBLOCKEDDATES FROM ;with Calendar as ( select EventID, EventTitle, EventStartDate, EventEndDate, EventEnumDays,EventStartTime,EventEndTime, EventRecurring, EventStartDate as PlannedDate ,EventType from EventCalender where EventActive = 1 AND LanguageID =1 AND EventBlockDate = 1 union all select EventID, EventTitle, EventStartDate, EventEndDate, EventEnumDays,EventStartTime,EventEndTime, …

3
รวม INSERT INTO และกับ / CTE
ฉันมี CTE ที่ซับซ้อนมากและฉันต้องการแทรกผลลัพธ์ลงในตารางทางกายภาพ ต่อไปนี้ถูกต้องหรือไม่ INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos ( BatchID, AccountNo, APartyNo, SourceRowID ) WITH tab ( -- some query ) SELECT * FROM tab ฉันคิดว่าจะใช้ฟังก์ชั่นในการสร้าง CTE นี้ซึ่งจะทำให้ฉันสามารถใช้งานได้อีกครั้ง ความคิดใด ๆ

2
ทำให้มันง่ายและวิธีการหลาย CTE ในแบบสอบถาม
ฉันมีแบบสอบถาม T-SQL ง่าย ๆ นี้มันปล่อยกลุ่มคอลัมน์จากตารางและรวมข้อมูลจากตารางอื่น ๆที่เกี่ยวข้อง แบบจำลองข้อมูลของฉันง่าย ฉันมีกิจกรรมที่กำหนดไว้พร้อมผู้เข้าร่วม ฉันจำเป็นต้องรู้จำนวนผู้เข้าร่วมในแต่ละเหตุการณ์ วิธีแก้ปัญหาของฉันคือการเพิ่ม CTE ที่จัดกลุ่มกิจกรรมตามกำหนดเวลาและนับจำนวนผู้เข้าร่วม สิ่งนี้จะทำให้ฉันเข้าร่วมในข้อมูลนั้นต่อเหตุการณ์ที่กำหนดไว้ ทำให้การสืบค้นง่ายขึ้น ฉันต้องการที่จะทำให้การสืบค้นของฉันง่าย แต่ถ้าฉันเคยมีในอนาคตจำเป็นต้องมีผลลัพธ์ชั่วคราวเพิ่มเติมที่สามารถเข้าถึงได้ในระหว่างการสืบค้นง่ายๆฉันจะทำอย่างไร ฉันอยากได้มันถ้าฉันมี CTE ได้หลายอัน แต่ทำไม่ได้ใช่ไหม? ตัวเลือกของฉันที่นี่มีอะไรบ้าง ฉันตัดทอนมุมมองและทำสิ่งต่าง ๆ ในชั้นข้อมูลแอปพลิเคชัน ฉันชอบที่จะแยกแบบสอบถาม SQL ของฉัน

9
ความแตกต่างระหว่าง CTE และ SubQuery หรือไม่
จากโพสต์นี้จะใช้ ROW_NUMBER อย่างไรในขั้นตอนต่อไปนี้? มีสองรุ่นของคำตอบที่หนึ่งใช้sub-queryและอื่น ๆ ใช้CTEเพื่อแก้ปัญหาเดียวกัน ตอนนี้ข้อดีของการใช้คำCTE (Common Table Expression)สั่งย่อย 'over-query' (ดังนั้นยิ่งอ่านง่ายยิ่งขึ้นว่าการสืบค้นทำอะไรอยู่จริง) ประโยชน์เฉพาะของใช้CTEมากกว่าsub-selectคือว่าที่จริงผมสามารถตั้งชื่อ sub-queryมีความแตกต่างอื่น ๆ ระหว่างสองสิ่งนี้หรือไม่เมื่อใช้ CTE เป็น CTE แบบง่าย ๆ (ไม่ใช่แบบเรียกซ้ำ)?

2
การเรียกซ้ำสูงสุด 100 หมดลงก่อนที่คำสั่งจะเสร็จสมบูรณ์
ฉันได้รับmax recursion errorคำถามนี้เรื่อย ๆ ตอนแรกฉันคิดว่าเป็นเพราะมีการส่งคืนค่าว่างจากนั้นมันจะพยายามจับคู่ค่าว่างทำให้เกิดข้อผิดพลาดอย่างไรก็ตามฉันเขียนแบบสอบถามของฉันใหม่เพื่อไม่ให้ค่าว่างกลับมาและข้อผิดพลาดยังคงเกิดขึ้น อะไรคือวิธีที่ดีที่สุดในการเขียนฟังก์ชันนี้ใหม่เพื่อไม่ให้เกิดข้อผิดพลาด WITH EmployeeTree AS ( SELECT EMP_SRC_ID_NR Id, USR_ACV_DIR_ID_TE Uuid, CASE Employees.APV_MGR_EMP_ID WHEN Null THEN '0' ELSE Employees.APV_MGR_EMP_ID END as ApprovalManagerId FROM dbo.[tEmployees] as Employees WITH (NOLOCK) WHERE APV_MGR_EMP_ID = @Id and Employees.APV_MGR_EMP_ID is not null and Employees.EMP_SRC_ID_NR is not null UNION ALL SELECT EMP_SRC_ID_NR …


7
คุณใช้ประโยค“ ด้วย” ใน MySQL ได้อย่างไร?
ฉันกำลังแปลงแบบสอบถาม SQL Server ทั้งหมดของฉันเป็น MySQL และแบบสอบถามของฉันที่มีWITHอยู่ในนั้นล้วนล้มเหลว นี่คือตัวอย่าง: WITH t1 AS ( SELECT article.*, userinfo.*, category.* FROM question INNER JOIN userinfo ON userinfo.user_userid = article.article_ownerid INNER JOIN category ON article.article_categoryid = category.catid WHERE article.article_isdeleted = 0 ) SELECT t1.* FROM t1 ORDER BY t1.article_date DESC LIMIT 1, 3

4
SQL Server CTE และตัวอย่างการเรียกซ้ำ
ฉันไม่เคยใช้ CTE กับการเรียกซ้ำ ฉันเพิ่งอ่านบทความเกี่ยวกับเรื่องนี้ บทความนี้แสดงข้อมูลพนักงานด้วยความช่วยเหลือของ Sql server CTE และการเรียกซ้ำ โดยทั่วไปจะแสดงข้อมูลพนักงานและข้อมูลผู้จัดการของพวกเขา ฉันไม่เข้าใจวิธีการทำงานของคำค้นหานี้ นี่คือคำถาม: WITH cteReports (EmpID, FirstName, LastName, MgrID, EmpLevel) AS ( SELECT EmployeeID, FirstName, LastName, ManagerID, 1 FROM Employees WHERE ManagerID IS NULL UNION ALL SELECT e.EmployeeID, e.FirstName, e.LastName, e.ManagerID, r.EmpLevel + 1 FROM Employees e INNER JOIN cteReports r …

2
จะใช้หลายคำสั่ง WITH ในแบบสอบถาม PostgreSQL ได้อย่างไร?
ฉันต้องการ "ประกาศ" ตาราง TEMP หลายตารางที่มีประสิทธิภาพโดยใช้คำสั่ง WITH ข้อความค้นหาที่ฉันพยายามดำเนินการอยู่ในแนวของ: WITH table_1 AS ( SELECT GENERATE_SERIES('2012-06-29', '2012-07-03', '1 day'::INTERVAL) AS date ) WITH table_2 AS ( SELECT GENERATE_SERIES('2012-06-30', '2012-07-13', '1 day'::INTERVAL) AS date ) SELECT * FROM table_1 WHERE date IN table_2 ฉันได้อ่านเอกสาร PostgreSQLและค้นคว้าเกี่ยวกับการใช้WITHคำสั่งหลาย ๆคำสั่งและไม่สามารถหาคำตอบได้

8
MySQL“ ด้วย” ประโยค
ฉันกำลังพยายามใช้ MySQL เพื่อสร้างมุมมองที่มีอนุประโยค "ด้วย" WITH authorRating(aname, rating) AS SELECT aname, AVG(quantity) FROM book GROUP BY aname แต่ดูเหมือนว่า MySQL จะไม่รองรับสิ่งนี้ ฉันคิดว่านี่เป็นมาตรฐานที่ดีและฉันแน่ใจว่า Oracle รองรับสิ่งนี้ มีการบังคับให้ MySQL ใช้อนุประโยค "ด้วย" หรือไม่? ฉันได้ลองใช้กับโปรแกรม MyISAM และ innoDB แล้ว ทั้งสองอย่างนี้ไม่ได้ผล

2
ฉันจะมีนิพจน์ตารางทั่วไปหลายรายการในคำสั่ง SELECT เดียวได้อย่างไร
ฉันอยู่ในขั้นตอนการลดความซับซ้อนของคำสั่ง select ที่ซับซ้อนดังนั้นฉันคิดว่าฉันจะใช้นิพจน์ตารางทั่วไป การประกาศ cte เดียวทำงานได้ดี WITH cte1 AS ( SELECT * from cdr.Location ) select * from cte1 เป็นไปได้หรือไม่ที่จะประกาศและใช้มากกว่าหนึ่ง cte ใน SELECT เดียวกัน นั่นคือ sql นี้ให้ข้อผิดพลาด WITH cte1 as ( SELECT * from cdr.Location ) WITH cte2 as ( SELECT * from cdr.Location ) select * from cte1 union …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.