คำถามติดแท็ก cte

อักษรย่อสำหรับนิพจน์ตารางทั่วไป แบบสอบถามย่อยชั่วคราวที่ใช้ซ้ำได้ซึ่งอาจเรียกซ้ำได้

7
CTE และ Temp Table แตกต่างกันอย่างไร
Common Table Expression (CTE) และ temp แตกต่างกันอย่างไร และฉันควรใช้อันใดอันหนึ่ง CTE WITH cte (Column1, Column2, Column3) AS ( SELECT Column1, Column2, Column3 FROM SomeTable ) SELECT * FROM cte ตารางอุณหภูมิ SELECT Column1, Column2, Column3 INTO #tmpTable FROM SomeTable SELECT * FROM #tmpTable
174 sql-server  cte 


3
Common Table Expression (CTE) มีประโยชน์อย่างไร?
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Exchange Administrators Stack Exchange อพยพ 7 ปีที่ผ่านมา จากmsdn : ต่างจากตารางที่ได้รับ CTE สามารถอ้างอิงตนเองและสามารถอ้างอิงได้หลายครั้งในแบบสอบถามเดียวกัน ฉันใช้ CTE ค่อนข้างมาก แต่ฉันไม่เคยคิดอย่างถี่ถ้วนเกี่ยวกับประโยชน์ของการใช้มัน ถ้าฉันอ้างอิง CTE หลายครั้งในแบบสอบถามเดียวกัน: มีประโยชน์ใด ๆ เกี่ยวกับประสิทธิภาพหรือไม่ ถ้าฉันเข้าร่วมด้วยตนเอง SQL Server จะสแกนตารางเป้าหมายสองครั้งหรือไม่
21 sql-server  cte 

4
การเรียกใช้ SQL ซ้ำใช้งานได้จริงอย่างไร
เมื่อมาถึง SQL จากภาษาการเขียนโปรแกรมอื่นโครงสร้างของเคียวรีแบบเรียกซ้ำจะค่อนข้างแปลก เดินผ่านทีละขั้นตอนและดูเหมือนว่าจะกระจุย ลองพิจารณาตัวอย่างง่ายๆดังต่อไปนี้: CREATE TABLE #NUMS (N BIGINT); INSERT INTO #NUMS VALUES (3), (5), (7); WITH R AS ( SELECT N FROM #NUMS UNION ALL SELECT N*N AS N FROM R WHERE N*N < 10000000 ) SELECT N FROM R ORDER BY N; ลองเดินดูกัน ขั้นแรกสมาชิกจุดยึดดำเนินการและชุดผลลัพธ์ถูกใส่ใน R ดังนั้น R …

5
สร้างคำแนะนำแผนเพื่อแคช (ผลการสปูลขี้เกียจ) CTE
ปกติแล้วฉันจะสร้างคำแนะนำแผนโดยการสร้างแบบสอบถามที่ใช้แผนที่ถูกต้องและคัดลอกไปยังแบบสอบถามที่คล้ายกันซึ่งไม่ได้ อย่างไรก็ตามบางครั้งก็เป็นเรื่องยากโดยเฉพาะอย่างยิ่งหากแบบสอบถามไม่เหมือนกันทั้งหมด วิธีที่ถูกต้องในการสร้างคำแนะนำแผนคืออะไร? SQLKiwi ได้กล่าวถึงการร่างแผนใน SSIS มีวิธีหรือเครื่องมือที่มีประโยชน์เพื่อช่วยในการจัดทำแผนดีสำหรับ SQL Server หรือไม่? ตัวอย่างที่เป็นปัญหาคือ CTE: SQLFiddle with cte(guid,other) as ( select newid(),1 union all select newid(),2 union all select newid(),3) select a.guid, a.other, b.guid guidb, b.other otherb from cte a cross join cte b order by a.other, b.other; มีวิธีใดบ้างที่จะทำให้ผลลัพธ์นั้นมี 3 guids ที่แตกต่างกันและไม่มีอีกต่อไป? ฉันหวังว่าจะสามารถตอบคำถามได้ดีขึ้นในอนาคตโดยรวมถึงคำแนะนำแผนกับแบบสอบถามชนิด …
19 sql-server  t-sql  cte 

2
วนซ้ำ CTE เพื่อหาผลรวมสำหรับเด็กทุกคน
นี่คือต้นไม้ประกอบที่ฉันต้องการค้นหาโดยใช้T-SQLแบบสอบถามซ้ำ(สมมุติCTE) ด้วยผลลัพธ์ที่คาดหวังด้านล่าง ฉันต้องการที่จะรู้จำนวนรวมต่อการชุมนุมที่ได้รับส่วนใดส่วนหนึ่ง หมายความว่าถ้าฉันค้นหา 'หมุดย้ำ' ฉันต้องการทราบจำนวนรวมในแต่ละระดับภายในการชุมนุมไม่ใช่เฉพาะจำนวนลูกโดยตรง Assembly (id:1) | |-Rivet |-Rivet |-SubAssembly (id:2) | | | |-Rivet | |-Bolt | |-Bolt | |-SubSubAssembly (id:3) | | | |-Rivet | |-Rivet | |-SubAssembly (id:4) |-Rivet |-Bolt DESIRED Results ------- ID, Count 1 , 6 2 , 3 3 , 2 4 …

2
การทำงานหลายอย่างโดยใช้ WITH
มีวิธีการดำเนินการหลายการใช้WITHคำสั่งหรือไม่ สิ่งที่ต้องการ WITH T AS ( SELECT * FROM Tbl ) BEGIN OPEN P_OUTCURSOR FOR SELECT * FROM T; SELECT COUNT(*) INTO P_OUTCOUNT FROM T; END; ฉันต้องการเลือกข้อมูลและจำนวนของมัน ...
16 oracle  select  cte 

2
ความลึกของลูกหลานแบบเรียกซ้ำ PostgreSQL
ฉันต้องคำนวณความลึกของลูกหลานจากบรรพบุรุษของมัน เมื่อมีการบันทึกobject_id = parent_id = ancestor_idจะถือว่าเป็นโหนดรูท (บรรพบุรุษ) ผมได้พยายามที่จะได้รับWITH RECURSIVEการสอบถามการทำงานกับ PostgreSQL 9.4 ฉันไม่ได้ควบคุมข้อมูลหรือคอลัมน์ data และ schema ของตารางมาจากแหล่งภายนอก ตารางจะเติบโตอย่างต่อเนื่อง ตอนนี้บันทึกประมาณ 30k ต่อวัน โหนดใด ๆ ในทรีสามารถหายไปและพวกเขาจะถูกดึงจากแหล่งภายนอกในบางจุด พวกเขามักจะถูกดึงcreated_at DESCตามลำดับ แต่ข้อมูลจะถูกดึงด้วยงานพื้นหลังแบบอะซิงโครนัส เริ่มแรกเรามีวิธีแก้ไขปัญหาของรหัส แต่ตอนนี้มี 5M + แถวใช้เวลาเกือบ 30 นาทีจึงจะเสร็จสมบูรณ์ ตัวอย่างคำจำกัดความของตารางและข้อมูลการทดสอบ: CREATE TABLE objects ( id serial NOT NULL PRIMARY KEY, customer_id integer NOT NULL, object_id integer …

3
การปรับลำดับชั้นของ CTE ให้เหมาะสม
อัปเดตด้านล่าง ฉันมีตารางบัญชีที่มีสถาปัตยกรรมบัญชี acct / parent โดยทั่วไปเพื่อแสดงลำดับชั้นของบัญชี (SQL Server 2012) ฉันสร้างมุมมองโดยใช้ CTE เพื่อตัดลำดับชั้นและโดยรวมแล้วทำงานได้อย่างสวยงามและตามที่ตั้งใจไว้ ฉันสามารถสอบถามลำดับชั้นได้ทุกระดับและดูสาขาได้อย่างง่ายดาย มีฟิลด์ตรรกะทางธุรกิจหนึ่งฟิลด์ที่จำเป็นต้องส่งคืนเป็นฟังก์ชันของลำดับชั้น ฟิลด์ในแต่ละบัญชีบันทึกอธิบายขนาดของธุรกิจ (เราจะเรียกว่า CustomerCount) ตรรกะที่ฉันต้องการในการรายงานความต้องการในการสะสม CustomerCount จากสาขาทั้งหมด กล่าวอีกนัยหนึ่งเมื่อได้รับบัญชีฉันต้องสรุปยอดเงินของลูกค้าสำหรับบัญชีนั้นพร้อมกับเด็กทุกคนในทุกสาขาด้านล่างบัญชีตามลำดับชั้น ฉันคำนวณฟิลด์สำเร็จโดยใช้ฟิลด์ลำดับชั้นที่สร้างขึ้นภายใน CTE ซึ่งดูเหมือน acct4.acct3.acct2.acct1 ปัญหาที่ฉันพบคือทำให้มันทำงานได้เร็ว หากไม่มีฟิลด์คำนวณนี้แบบสอบถามจะทำงานใน ~ 3 วินาที เมื่อฉันเพิ่มในเขตข้อมูลจากการคำนวณมันจะกลายเป็นแบบสอบถาม 4 นาที นี่คือรุ่นที่ดีที่สุดที่ฉันสามารถพบได้เพื่อให้ได้ผลลัพธ์ที่ถูกต้อง ฉันกำลังมองหาแนวคิดในการปรับโครงสร้างมุมมองนี้โดยไม่ต้องเสียสละอย่างมากต่อการแสดง ฉันเข้าใจเหตุผลที่สิ่งนี้ช้าลง (ต้องคำนวณภาคแสดงในส่วนคำสั่งที่ไหน) แต่ฉันไม่สามารถคิดวิธีอื่นในการจัดโครงสร้างและยังได้ผลลัพธ์เดียวกัน นี่คือตัวอย่างรหัสบางส่วนเพื่อสร้างตารางและทำ CTE ให้ตรงตามที่ใช้ในสภาพแวดล้อมของฉัน Use Tempdb go CREATE TABLE dbo.Account ( Acctid varchar(1) …

2
ฟังก์ชั่น PostgreSQL ไม่ได้ดำเนินการเมื่อเรียกจากภายใน CTE
เพียงแค่หวังที่จะยืนยันการสังเกตของฉันและรับคำอธิบายเกี่ยวกับสาเหตุที่เกิดขึ้น ฉันมีฟังก์ชั่นที่กำหนดเป็น: CREATE OR REPLACE FUNCTION "public"."__post_users_id_coin" ("coins" integer, "userid" integer) RETURNS TABLE (id integer) AS ' UPDATE users SET coin = coin + coins WHERE userid = users.id RETURNING users.id' LANGUAGE "sql" COST 100 ROWS 1000 VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER เมื่อฉันเรียกใช้ฟังก์ชันนี้จาก CTE คำสั่งจะเรียกใช้งานคำสั่ง SQL แต่ไม่เรียกใช้ฟังก์ชันตัวอย่างเช่น: …
14 postgresql  cte 

2
ทำไม CTE ควรเริ่มต้นด้วยเซมิโคลอน
ฉันแค่ดูโพสต์ในStackOverflowที่ Aaron Bertrand เสนอให้ใช้ CTE แทนตารางตัวเลขซึ่งเป็นวิธีที่ยอดเยี่ยมในการปฏิบัติงานในมือ คำถามของฉันคือทำไมบรรทัดแรกของ CTE เริ่มต้นด้วยเซมิโคลอน ;WITH n AS (SELECT TOP (10000) n FROM (SELECT n = ROW_NUMBER() OVER (ORDER BY s1.[object_id]) FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2 ) AS x ORDER BY n ) SELECT n FROM n ORDER BY n; -- look …
14 sql-server  t-sql  cte  syntax 

2
เหตุใดจึงไม่สามารถแทรกแถวใน CTE ไม่สามารถอัปเดตในคำสั่งเดียวกันได้
ใน PostgreSQL 9.5 ให้สร้างตารางง่ายๆด้วย: create table tbl ( id serial primary key, val integer ); ฉันเรียกใช้ SQL เพื่อแทรกค่าจากนั้นอัปเดตในคำสั่งเดียวกัน: WITH newval AS ( INSERT INTO tbl(val) VALUES (1) RETURNING id ) UPDATE tbl SET val=2 FROM newval WHERE tbl.id=newval.id; ผลลัพธ์คือ UPDATE ถูกละเว้น: testdb=> select * from tbl; ┌────┬─────┐ │ id │ …
13 postgresql  cte 

1
จะกรองการใช้ฟังก์ชันที่ผู้ใช้กำหนดเองของ Scalar จากข้อมูลการตรวจสอบเซิร์ฟเวอร์ SQL ได้อย่างไร
เรามีฐานข้อมูล SQL Server ซึ่งมีข้อกำหนดการตรวจสอบฐานข้อมูลที่ตรวจสอบการดำเนินการทั้งหมดในฐานข้อมูล CREATE DATABASE AUDIT SPECIFICATION [dbAudit] FOR SERVER AUDIT [servAudit] ADD (EXECUTE ON DATABASE::[DatabaseName] BY [public]) เราพบว่าแบบสอบถามบางข้อจะเขียนลงในบันทึกการตรวจสอบโดยใช้ฟังก์ชั่นสเกลาร์สำหรับทุกแถวในชุดผลลัพธ์ เมื่อสิ่งนี้เกิดขึ้นบันทึกจะเต็มก่อนที่เราจะสามารถ ETL ลงในที่ซึ่งเป็นสถานที่พักผ่อนขั้นสุดท้ายและเรามีช่องว่างในการบันทึกของเรา น่าเสียดายเนื่องจากเหตุผลด้านความสอดคล้องเราไม่สามารถหยุดการตรวจสอบทุกEXECUTEคำสั่งได้ ความคิดแรกของเราสำหรับแนวทางในการแก้ไขปัญหานี้คือการใช้WHEREข้อในการตรวจสอบเซิร์ฟเวอร์เพื่อกรองกิจกรรม รหัสดูเหมือนว่านี้: WHERE [object_id] not in (Select object_id from sys.objects where type = 'FN' ) น่าเสียดายที่ SQL Server ไม่อนุญาตให้ตัวดำเนินการสัมพันธ์ (อาจเป็นเพราะมันไม่ต้องการสอบถามทุกครั้งที่มีการเขียนไปยังบันทึกการตรวจสอบ) เราต้องการหลีกเลี่ยงการเขียน proc ที่เก็บไว้ซึ่งเป็นรหัสที่ยากobject_idในWHEREข้อ แต่นั่นคือความคิดของเราในปัจจุบันเกี่ยวกับวิธีที่ดีที่สุดในการแก้ไขปัญหานี้ มีวิธีอื่นที่เราควรพิจารณาหรือไม่? เราสังเกตเห็นว่าเมื่อฟังก์ชั่นสเกลาร์ถูกใช้ใน …

1
ฉันจะจัดเรียงผลลัพธ์ของข้อความค้นหาแบบเรียกซ้ำในลักษณะคล้ายต้นไม้แบบขยายได้อย่างไร
สมมติว่าคุณมีnodesตารางแบบนี้: CREATE TABLE nodes ( node serial PRIMARY KEY, parent integer NULL REFERENCES nodes(node), ts timestamp NOT NULL DEFAULT now() ); มันแสดงให้เห็นถึงโครงสร้างต้นไม้เหมือนโหนดมาตรฐานที่มีรูตโหนดที่ด้านบนและโหนดเด็กหลายห้อยจากโหนดรูทหรือโหนดเด็กอื่น ๆ ให้เราแทรกค่าตัวอย่างสองสามค่า: INSERT INTO nodes (parent) VALUES (NULL), (NULL), (NULL), (NULL), (1), (1), (1), (1), (6), (1) , (6), (9), (6), (6), (3), (3), (3), (15); ตอนนี้ฉันต้องการเรียกรูต 10 …

1
ผลลัพธ์ที่น่าแปลกใจสำหรับประเภทข้อมูลที่มีตัวแก้ไขประเภท
ในขณะที่พูดคุยโซลูชัน CTE แบบเรียกซ้ำสำหรับคำถามนี้: รับ 5 ค่าที่แตกต่างล่าสุดสำหรับแต่ละ ID @ypercubeพบข้อผิดพลาดที่น่าแปลกใจซึ่งทำให้เราตรวจสอบการจัดการกับตัวดัดแปลงประเภท เราพบพฤติกรรมที่น่าประหลาดใจ 1. Type cast ยังคงประเภทโมดิฟายเออร์ในบางบริบท แม้เมื่อสั่งไม่ให้ ตัวอย่างพื้นฐานที่สุด: SELECT 'vc8'::varchar(8)::varchar หนึ่งอาจคาดหวังvarchar(ไม่มีตัวดัดแปลง) อย่างน้อยฉันจะ แต่ผลลัพธ์คือvarchar(8)(พร้อมตัวดัดแปลง) กรณีที่เกี่ยวข้องจำนวนมากในซอด้านล่าง 2. การต่อข้อมูล Array สูญเสียโมดิฟายเออร์ในบริบทบางอย่าง โดยไม่จำเป็นต้องใช้ดังนั้นข้อผิดพลาดนี้อยู่ฝั่งตรงข้าม: SELECT ARRAY['vc8']::varchar(8)[] , ARRAY['vc8']::varchar(8)[] || 'vc8'::varchar(8) นิพจน์แรกให้ผลvarchar(8)[]ตามที่คาดไว้ แต่ข้อที่ 2 หลังจากการต่อข้อมูลอื่นvarchar(8)จะถูกรดน้ำลงไปเพียงvarchar[](ไม่มีตัวปรับแต่ง) พฤติกรรมที่คล้ายกันจากarray_append()ตัวอย่างในซอด้านล่าง ทั้งหมดนี้ไม่สำคัญในบริบทส่วนใหญ่ Postgres จะไม่สูญเสียข้อมูลและเมื่อกำหนดให้กับคอลัมน์ค่าจะถูกบังคับให้เป็นประเภทที่ถูกต้องอย่างไรก็ตาม อย่างไรก็ตามการทำผิดในทิศทางตรงกันข้ามจะทำให้เกิดข้อยกเว้นที่น่าประหลาดใจ: 3. Recursive CTE ต้องการประเภทข้อมูลให้ตรงกัน รับตารางง่ายนี้ CREATE TABLE a ( …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.