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

ส่วนการเข้าร่วม SQL รวมระเบียนจากสองตารางหรือมากกว่าหรือมุมมอง

4
วิธีเข้าร่วมสองตารางเพื่อให้หายไปแถวในตารางที่สอง
ในระบบการลงคะแนนแบบง่าย ๆ เช่น CREATE TABLE elections ( election_id int(11) NOT NULL AUTO_INCREMENT, title varchar(255), CREATE TABLE votes ( election_id int(11), user_id int(11), FOREIGN KEYs สำหรับการรับรายชื่อผู้มีสิทธิเลือกตั้งผู้ใช้ JOIN ต่อไปนี้จะถูกใช้ SELECT * FROM elections JOIN votes USING(election_id) WHERE votes.user_id='x' แต่จะได้รับรายชื่อการเลือกตั้งที่ผู้ใช้ไม่ได้ลงคะแนนได้อย่างไร
21 join  select 

3
แบบแผนการตั้งชื่อชื่อคอลัมน์และแนวปฏิบัติที่เหมาะสมที่สุด
ฉันต้องการความคิดเห็นของผู้เชี่ยวชาญบางประการเกี่ยวกับการปฏิบัติที่ดีที่สุดเมื่อมันมาถึงการตั้งชื่อคอลัมน์ พื้นหลังเป็นไปตาม Wikipedia , ไวยากรณ์ต่อไปนี้ SELECT ... FROM Employees JOIN Timesheets USING (EmployeeID); มีประสิทธิภาพมากกว่า SELECT ... FROM Employees JOIN Timesheets ON (Employees.EmployeeID = Timesheets.EmployeeID); อย่างไรก็ตามJOIN ... USINGไวยากรณ์ทำงานเฉพาะของคอลัมน์ที่สำคัญทั้งหมดหลักมีชื่อซ้ำกันทั่วโลก ดังนั้นฉันสงสัยว่านี่เป็นสิ่งที่ถูกต้องที่จะทำ ส่วนตัวผมมักจะใช้ในการสร้างตารางที่มีคอลัมน์ PK และคอลัมน์ที่สำคัญต่างประเทศid othertable_idแต่วิธีการมันเป็นไปไม่ได้ที่จะใช้หรือUSINGNATURAL JOIN การเชื่อมโยงใด ๆ กับสไตล์การออกแบบหรือแนวทางปฏิบัติที่ดีที่สุดสำหรับการออกแบบตารางจะได้รับการชื่นชมเช่นกัน!

3
แยกการสืบค้น SQL ที่มีการรวมเป็นจำนวนน้อย
เราต้องทำการรายงานบางอย่างทุกคืนใน SQL Server 2008 R2 ของเรา การคำนวณรายงานใช้เวลาหลายชั่วโมง เพื่อที่จะย่นเวลาเราจะคำนวณตารางล่วงหน้า ตารางนี้สร้างขึ้นจากการเข้าร่วม 12 ตารางที่มีขนาดค่อนข้างใหญ่ (หลายสิบล้านแถว) การคำนวณตารางรวมนี้ใช้เวลาไม่กี่วันที่ผ่านมา cca 4 ชั่วโมง DBA ของเราดีกว่าแบ่งการรวมครั้งใหญ่นี้ออกเป็น 3 การรวมที่เล็กกว่า (แต่ละการรวม 4 ตาราง) ผลลัพธ์ชั่วคราวจะถูกบันทึกลงในตารางชั่วคราวทุกครั้งที่ใช้ในการเข้าร่วมครั้งต่อไป ผลลัพธ์ของการปรับปรุง DBA คือตารางการรวมจะถูกคำนวณใน 15 นาที ฉันสงสัยว่าเป็นไปได้อย่างไร DBA บอกฉันว่ามันเป็นเพราะจำนวนข้อมูลที่เซิร์ฟเวอร์ต้องดำเนินการมีขนาดเล็กลง กล่าวอีกนัยหนึ่งว่าในการเข้าร่วมต้นฉบับใหญ่เซิร์ฟเวอร์ต้องทำงานกับข้อมูลมากกว่าการรวมตัวเล็กลง อย่างไรก็ตามฉันจะสันนิษฐานว่าเครื่องมือเพิ่มประสิทธิภาพจะดูแลการทำอย่างมีประสิทธิภาพด้วยการเข้าร่วมครั้งใหญ่โดยแยกการรวมเข้าด้วยกันและส่งเฉพาะจำนวนคอลัมน์ที่จำเป็นสำหรับการเข้าร่วมครั้งต่อไป อีกสิ่งที่เขาทำคือเขาสร้างดัชนีในหนึ่งในตารางชั่วคราว อย่างไรก็ตามอีกครั้งฉันคิดว่าเครื่องมือเพิ่มประสิทธิภาพจะสร้างตารางแฮชที่เหมาะสมหากจำเป็น ฉันพูดคุยเกี่ยวกับเรื่องนี้กับ DBA ของเรา แต่เขาเองก็ไม่แน่ใจเกี่ยวกับสิ่งที่ทำให้เวลาในการปรับปรุงดีขึ้น เขาเพิ่งพูดถึงว่าเขาจะไม่ตำหนิเซิร์ฟเวอร์เพราะมันมีจำนวนมหาศาลในการคำนวณข้อมูลขนาดใหญ่และเป็นไปได้ว่าเครื่องมือเพิ่มประสิทธิภาพมีเวลายากที่จะคาดการณ์แผนการดำเนินการที่ดีที่สุด ... ฉันเข้าใจสิ่งนี้ แต่ฉันต้องการคำตอบที่ชัดเจนยิ่งขึ้นว่าทำไม ดังนั้นคำถามคือ: สิ่งที่อาจทำให้เกิดการปรับปรุงครั้งใหญ่? มันเป็นขั้นตอนมาตรฐานในการแยกการรวมขนาดใหญ่ออกเป็นเล็กหรือไม่? ปริมาณของข้อมูลที่เซิร์ฟเวอร์มีการประมวลผลที่เล็กกว่าจริง ๆ ในกรณีที่มีการรวมขนาดเล็กหลายครั้งหรือไม่? …

2
เข้าร่วม SQL Server / สถานที่ประมวลผลคำสั่ง
หลังจากอ่านแบบสอบถาม SQL ช้าไม่แน่ใจว่าจะเพิ่มประสิทธิภาพมันทำให้ฉันคิดเกี่ยวกับประสิทธิภาพการทำงานทั่วไปของแบบสอบถาม แน่นอนว่าเราต้องการผลลัพธ์ของตารางแรก (เมื่อมีการรวมตารางอื่น ๆ ) ให้เล็กที่สุดเท่าที่จะเป็นไปได้ก่อนที่จะเข้าร่วม (Inner joins สำหรับคำถามนี้) เพื่อให้การสืบค้นของเราเร็วขึ้นเล็กน้อย ตัวอย่างควร: SELECT * FROM ( SELECT * FROM table1 WHERE col = @val ) t INNER JOIN table2 ON col = col2 จะดีกว่า / เร็วกว่า: SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col …

1
การตั้งชื่อความขัดแย้งระหว่างฟังก์ชั่นพารามิเตอร์และผลลัพธ์ของการเข้าร่วมกับการใช้ข้อ
รับการตั้งค่านี้ใน Postgres ปัจจุบัน 9.4 ( จากคำถามที่เกี่ยวข้อง ): CREATE TABLE foo (ts, foo) AS VALUES (1, 'A') -- int, text , (7, 'B'); CREATE TABLE bar (ts, bar) AS VALUES (3, 'C') , (5, 'D') , (9, 'E'); นอกจากนี้ยังมีซอ Fiddleจากคำถามก่อนหน้านี้ ฉันเขียนSELECTด้วยFULL JOINเพื่อให้บรรลุวัตถุประสงค์ของคำถามอ้างอิง ย่อ: SELECT ts, f.foo, b.bar FROM foo f FULL …

3
มีประสิทธิภาพมากขึ้นคืออะไรส่วนคำสั่งหรือการรวมกับตารางล้านบวกแถว?
เราเรียกใช้เว็บไซต์ที่มีแถว 250 มม. ในหนึ่งตารางและในอีกตารางหนึ่งที่เราเข้าร่วมเพื่อการค้นหาส่วนใหญ่จะมีแถวที่ต่ำกว่า 15 มม. โครงสร้างตัวอย่าง: MasterTable (Id, UserId, Created, Updated...) -- 15MM Rows DetailsTable (Id, MasterId, SomeColumn...) -- 250MM Rows UserTable (Id, Role, Created, UserName...) -- 12K Rows เราต้องทำแบบสอบถามสองสามข้อกับตารางเหล่านี้เป็นประจำ หนึ่งคือสถิติโลภสำหรับผู้ใช้ฟรี (ผู้ใช้ฟรี ~ 10k) Select Count(1) from DetailsTable dt join MasterTable mt on mt.Id = dt.MasterId join UserTable ut …

1
เหตุใดแบบสอบถามย่อยจึงใช้การขนานและการเข้าร่วมไม่ได้
เหตุใดเซิร์ฟเวอร์ SQL จึงใช้ความขนานเมื่อเรียกใช้แบบสอบถามนี้ซึ่งใช้แบบสอบถามย่อย แต่ไม่ใช้เมื่อเข้าร่วม เวอร์ชันการเข้าร่วมจะทำงานเป็นอนุกรมและใช้เวลาดำเนินการนานกว่าประมาณ 30 เท่า เข้าร่วมเวอร์ชัน: ~ 30 วินาที เวอร์ชันย่อยของแบบสอบถาม: <1 วินาที แก้ไข: แผนแบบสอบถามเวอร์ชัน Xml: เข้าร่วมเวอร์ชัน รุ่น SUBQUERY

2
ดัชนีในคีย์หลักไม่ได้ใช้ในการเข้าร่วมง่าย
ฉันมีคำนิยามตารางและดัชนีต่อไปนี้: CREATE TABLE munkalap ( munkalap_id serial PRIMARY KEY, ... ); CREATE TABLE munkalap_lepes ( munkalap_lepes_id serial PRIMARY KEY, munkalap_id integer REFERENCES munkalap (munkalap_id), ... ); CREATE INDEX idx_munkalap_lepes_munkalap_id ON munkalap_lepes (munkalap_id); ทำไมไม่มีดัชนีใน munkalap_id ที่ใช้ในการสืบค้นต่อไปนี้? EXPLAIN ANALYZE SELECT ml.* FROM munkalap m JOIN munkalap_lepes ml USING (munkalap_id); QUERY PLAN Hash …

2
กรณีการเข้าร่วม Oracle ภายนอกที่แปลกประหลาด
ฉันได้เห็นสิ่งต่อไปนี้ในแบบสอบถามที่ควรจะถูกย้ายจาก Oracle outer join syntax ไปเป็น SQL standard outer join syntax: SELECT ... FROM A, B, C, D, E WHERE A.A_ID = B.A_ID AND B.B_ID = C.A_ID(+) AND B.B_KEY = C.B_KEY(+) AND C.C_ID = D.C_ID(+) AND B.A_ID = E.A_ID(+) AND B.B_KEY = E.B_KEY(+) AND 'CONSTANT' = C.X_ID(+) ตอนนี้การแปลไวยากรณ์การรวมภายนอกนั้นเป็นกระบวนการทางกล แต่บรรทัดสุดท้ายนั่นทำให้ฉันงุนงง มันหมายความว่าอะไร? …
16 oracle  join  syntax 

2
PostgreSQL เข้าร่วมโดยใช้ JSONB
ฉันมี SQL นี้: CREATE TABLE test(id SERIAL PRIMARY KEY, data JSONB); INSERT INTO test(data) VALUES ('{"parent":null,"children":[2,3]}'), ('{"parent":1, "children":[4,5]}'), ('{"parent":1, "children":[]}'), ('{"parent":2, "children":[]}'), ('{"parent":2, "children":[]}'); ที่จะให้: id | data ----+-------------------------------------- 1 | {"parent": null, "children": [2, 3]} 2 | {"parent": 1, "children": [4, 5]} 3 | {"parent": 1, "children": []} 4 …

4
รวมตัวเองแบบเรียกซ้ำ
ฉันมีcommentsตารางซึ่งสามารถทำให้ง่ายลงไปนี้: comments ======= id user_id text parent_id โดยที่parent_idnullable แต่อาจเป็นกุญแจสำคัญสำหรับความคิดเห็นหลัก ตอนนี้ฉันจะselectทายาทของความคิดเห็นเฉพาะได้อย่างไร ความคิดเห็นอาจลดลงหลายระดับ ...

1
ลบแถวที่ไม่ได้อ้างอิงในตารางอื่น
ฉันมีสองตารางในฐานข้อมูล PostgreSQL 9.3 ตารางที่link_replyมีคีย์ต่างประเทศชื่อชี้ไปที่โต๊ะwhich_grouplink_group ฉันต้องการลบแถวทั้งหมดจากlink_groupที่ไม่มีแถวที่เกี่ยวข้องlink_replyอยู่ ฟังดูธรรมดาพอ แต่ฉันก็ดิ้นรนกับมัน มันจะเป็นอะไรที่เรียบง่ายแบบนี้ (ไม่ทำงาน)? DELETE FROM link_group WHERE link_reply = NULL;

4
การเข้าร่วมได้รับการปรับให้เหมาะสมกับส่วนคำสั่งที่ runtime หรือไม่
เมื่อฉันเขียนแบบสอบถามเช่นนี้ ... select * from table1 t1 join table2 t2 on t1.id = t2.id เครื่องมือเพิ่มประสิทธิภาพ SQL ไม่แน่ใจว่าเป็นคำที่ถูกต้องแปลว่าเป็น ... select * from table1 t1, table2 t2 where t1.id = t2.id โดยพื้นฐานแล้วคำสั่งเข้าร่วมใน SQL Server เป็นวิธีที่ง่ายกว่าในการเขียน sql หรือไม่ หรือใช้จริงในเวลาทำงาน? แก้ไข: ฉันเกือบจะตลอดและจะใช้เข้าร่วมไวยากรณ์ ฉันแค่อยากรู้ว่าเกิดอะไรขึ้น

5
จับคู่คอลัมน์เดี่ยวกับค่าหลายค่าโดยไม่มีตารางการเข้าร่วมด้วยตนเองใน MySQL
เรามีตารางที่เราใช้เก็บคำตอบของคำถาม เราจำเป็นต้องสามารถค้นหาผู้ใช้ที่มีคำตอบบางคำถาม ดังนั้นหากตารางของเราประกอบด้วยข้อมูลต่อไปนี้: user_id question_id answer_value Sally 1 Pooch Sally 2 Peach John 1 Pooch John 2 Duke และเราต้องการค้นหาผู้ใช้ที่ตอบว่า 'Pooch' สำหรับคำถามที่ 1 และ 'Peach' สำหรับคำถามที่ 2 SQL จะดังต่อไปนี้ (ชัด) ไม่ต้องกังวล: select user_id from answers where question_id=1 and answer_value = 'Pooch' and question_id=2 and answer_value='Peach' ความคิดแรกของฉันคือการเข้าร่วมโต๊ะด้วยตนเองสำหรับแต่ละคำตอบที่เรากำลังมองหา: select a.user_id from answers a, …

1
ทำไม PostgreSQL จึงเลือกการเข้าร่วมที่มีราคาแพงกว่า?
PostgreSQL ใช้ค่าเริ่มต้นบวก default_statistics_target=1000 random_page_cost=1.5 รุ่น PostgreSQL 10.4 on x86_64-pc-linux-musl, compiled by gcc (Alpine 6.4.0) 6.4.0, 64-bit ฉันดูดและวิเคราะห์แล้ว แบบสอบถามตรงไปตรงมามาก: SELECT r.price FROM account_payer ap JOIN account_contract ac ON ap.id = ac.account_payer_id JOIN account_schedule "as" ON ac.id = "as".account_contract_id JOIN schedule s ON "as".id = s.account_schedule_id JOIN rate r ON s.id = …

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