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

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

2
จะเร็วกว่าอะไรแบบสอบถามขนาดใหญ่หรือแบบสอบถามขนาดเล็กจำนวนมาก
ฉันทำงานให้กับ บริษัท ที่แตกต่างกันและฉันสังเกตเห็นว่าบางคนชอบที่จะมีมุมมองที่จะเข้าร่วมโต๊ะกับ "ญาติ" ทั้งหมดของมัน แต่ในบางครั้งเราจำเป็นต้องใช้เพียง 1 คอลัมน์เท่านั้น ดังนั้นจะเร็วกว่าที่จะทำการเลือกแบบง่าย ๆ แล้ว "เข้าร่วม" ในรหัสระบบหรือไม่ ระบบอาจเป็น php, java, asp, ภาษาใด ๆ ที่เชื่อมต่อกับฐานข้อมูล ดังนั้นคำถามคือสิ่งที่เร็วไปจากฝั่งเซิร์ฟเวอร์ (php, java, asp, ruby, python ... ) ไปยังฐานข้อมูลรันหนึ่งแบบสอบถามที่ได้รับทุกสิ่งที่เราต้องการหรือไปจากฝั่งเซิร์ฟเวอร์ไปยังฐานข้อมูลและเรียกใช้ แบบสอบถามที่ได้รับคอลัมน์จากตารางเดียวเท่านั้นหรือไม่

4
แนวปฏิบัติที่เหมาะสมระหว่างการใช้ LEFT JOIN หรือ EXISTS
มีวิธีปฏิบัติที่ดีที่สุดระหว่างการใช้ LEFT JOIN หรือรูปแบบ NOT EXISTS หรือไม่? ประโยชน์ที่จะได้รับจากการใช้อย่างใดอย่างหนึ่งคืออะไร? ถ้าไม่มีควรเลือกแบบไหนดี? SELECT * FROM tableA A LEFT JOIN tableB B ON A.idx = B.idx WHERE B.idx IS NULL SELECT * FROM tableA A WHERE NOT EXISTS (SELECT idx FROM tableB B WHERE B.idx = A.idx) ฉันใช้คิวรีภายใน Access กับฐานข้อมูล SQL Server

2
วิธีการเข้าร่วมตารางที่มีฟังก์ชั่นมูลค่าตาราง?
ฉันมีฟังก์ชั่นที่ผู้ใช้กำหนด: create function ut_FooFunc(@fooID bigint, @anotherParam tinyint) returns @tbl Table (Field1 int, Field2 varchar(100)) as begin -- blah blah end ตอนนี้ฉันต้องการเข้าร่วมในตารางอื่นเช่น: select f.ID, f.Desc, u.Field1, u.Field2 from Foo f join ut_FooFunc(f.ID, 1) u -- doesn't work where f.SomeCriterion = 1 ในคำอื่น ๆ สำหรับทุกFooระเบียนที่SomeCriterion1 ผมต้องการที่จะเห็นFoo IDและDescควบคู่ไปกับค่าของField1และField2ที่กลับมาจากการสำหรับการป้อนข้อมูลของut_FooFuncFoo.ID ไวยากรณ์ที่จะทำคืออะไร?

4
การสืบค้นแต่ละรายการเร็วกว่าการเข้าร่วมหรือไม่
คำถามแนวคิด: แบบสอบถามแต่ละรายการเร็วกว่าการเข้าร่วมหรือ: ฉันควรพยายามบีบข้อมูลทุกครั้งที่ฉันต้องการในฝั่งไคลเอ็นต์ให้เป็นคำสั่ง SELECT หนึ่งคำหรือใช้ให้มากที่สุดเท่าที่จะสะดวก? TL : DR : หากคิวรีที่เข้าร่วมของฉันใช้เวลานานกว่ารันคิวรีแต่ละรายการนี่เป็นความผิดของฉันหรือเป็นสิ่งที่คาดหวัง ก่อนอื่นฉันไม่ค่อยเข้าใจฐานข้อมูลมากนักดังนั้นอาจเป็นเพียงฉัน แต่ฉันสังเกตว่าเมื่อฉันต้องรับข้อมูลจากหลาย ๆ ตารางมันเร็วกว่าที่จะได้รับข้อมูลนี้จากการสืบค้นหลายรายการในตารางแต่ละรายการ มีการรวม Inner ง่ายๆ) และแก้ไขข้อมูลร่วมกันบนฝั่งไคลเอ็นต์ที่พยายามเขียนแบบสอบถามแบบซับซ้อน (ซับซ้อน) ที่ฉันสามารถรับข้อมูลทั้งหมดในแบบสอบถามเดียว ฉันพยายามใส่ตัวอย่างง่ายๆอย่างหนึ่งไว้ด้วยกัน: ซอ Fiddle การตั้งค่าสคีมา : CREATE TABLE MASTER ( ID INT NOT NULL , NAME VARCHAR2(42 CHAR) NOT NULL , CONSTRAINT PK_MASTER PRIMARY KEY (ID) ); CREATE TABLE DATA ( …

2
ทำไมการเปลี่ยนลำดับคอลัมน์การประกาศที่ประกาศจึงแนะนำการเรียงลำดับ
ฉันมีสองตารางที่มีชื่อคอลัมน์พิมพ์และดัชนีคีย์เหมือนกัน หนึ่งในพวกเขามีที่ไม่ซ้ำกันดัชนีคลัสเตอร์ที่หนึ่ง ๆ มีที่ไม่ซ้ำกัน การตั้งค่าการทดสอบ สคริปต์การตั้งค่ารวมถึงสถิติที่เป็นจริง: DROP TABLE IF EXISTS #left; DROP TABLE IF EXISTS #right; CREATE TABLE #left ( a char(4) NOT NULL, b char(2) NOT NULL, c varchar(13) NOT NULL, d bit NOT NULL, e char(4) NOT NULL, f char(25) NULL, g char(25) NOT NULL, h char(25) NULL …

7
เป็นไปได้หรือไม่ที่จะ mysqldump ชุดย่อยของฐานข้อมูลที่จำเป็นในการสร้างแบบสอบถาม?
พื้นหลัง ฉันต้องการให้ส่วนย่อยของฐานข้อมูลของฉันที่จำเป็นในการสร้างselectแบบสอบถาม เป้าหมายของฉันคือการทำให้เวิร์กโฟลว์การคำนวณของฉันทำซ้ำได้ (เช่นในการวิจัยที่ทำซ้ำได้ ) คำถาม มีวิธีที่ฉันสามารถรวมคำสั่ง select นี้ลงในสคริปต์ที่ทิ้งข้อมูลการสืบค้นลงในฐานข้อมูลใหม่หรือไม่เช่นนั้นฐานข้อมูลสามารถติดตั้งบนเซิร์ฟเวอร์ mysql ใหม่ได้และคำสั่งจะทำงานกับฐานข้อมูลใหม่ ฐานข้อมูลใหม่ไม่ควรมีเร็กคอร์ดนอกเหนือจากที่ใช้ในเคียวรี อัปเดต: เพื่อความกระจ่างฉันไม่สนใจ csv dump ของผลลัพธ์การสืบค้น สิ่งที่ฉันต้องทำคือการถ่ายโอนข้อมูลชุดย่อยฐานข้อมูลเพื่อให้สามารถติดตั้งบนเครื่องอื่นและจากนั้นแบบสอบถามสามารถทำซ้ำได้ (และแก้ไขได้ด้วยชุดข้อมูลเดียวกัน) ตัวอย่าง ตัวอย่างเช่นการวิเคราะห์ของฉันอาจเคียวรีชุดย่อยของข้อมูลที่ต้องการบันทึกจากหลาย ๆ ตาราง (ในตัวอย่างนี้ 3) ตาราง: select table1.id, table1.level, table2.name, table2.level from table1 join table2 on table1.id = table2.table1_id join table3 on table3.id = table2.table3_id where table3.name in ('fee', 'fi', …

1
Postgres นับด้วยเงื่อนไขที่แตกต่างกันในแบบสอบถามเดียวกัน
แก้ไข Postgres 9.3 ฉันกำลังทำงานกับรายงานที่มีสคีมาต่อไปนี้: http://sqlfiddle.com/#!15/fd104/2 แบบสอบถามปัจจุบันทำงานได้ดีซึ่งมีลักษณะเช่นนี้: โดยทั่วไปจะเข้าร่วม 3 ตารางภายใน ฉันไม่ได้ทำแบบสอบถามนี้ แต่นักพัฒนาที่ทิ้งไว้และฉันต้องการแก้ไขแบบสอบถาม ในขณะที่คุณสามารถมองเห็นเพียงแค่นับแอพลิเคชันทั้งหมดขึ้นอยู่กับTotalApplication a.agent_idและคุณสามารถดูtotalapplicationคอลัมน์ในผลลัพธ์ได้ สิ่งที่ฉันต้องการคือการลบและเปลี่ยนtotalapplicationเป็นสองคอลัมน์ใหม่ ฉันต้องการเพิ่มcompletedsurveyและpartitalsurveyคอลัมน์ โดยพื้นฐานแล้วส่วนนี้จะกลายเป็น SELECT a.agent_id as agent_id, COUNT(a.id) as CompletedSurvey FROM forms a WHERE a.created_at >= '2015-08-01' AND a.created_at <= '2015-08-31' AND disposition = 'Completed Survey' GROUP BY a.agent_id ฉันเพิ่งเพิ่มAND disposition = 'Completed Survey'แต่ฉันต้องการคอลัมน์อื่นpartialsurveyที่มีข้อความค้นหาเดียวกันโดยมีcompletedsurveyความแตกต่างเพียงอย่างเดียวคือ AND disposition = …

2
Outer Apply vs Left Join Performance
ฉันใช้ SQL Server 2008 R2 ฉันเพิ่งเจอ APPLY ใน SQL และชอบที่จะแก้ปัญหาการสืบค้นสำหรับหลาย ๆ กรณี ตารางจำนวนมากที่ฉันใช้ 2 left join เพื่อให้ได้ผลลัพธ์ฉันสามารถสมัครนอก 1 ครั้งได้ ฉันมีข้อมูลจำนวนเล็กน้อยในตารางฐานข้อมูลท้องถิ่นของฉันและหลังจากการปรับใช้รหัสควรทำงานบนข้อมูลอย่างน้อย 20 ครั้งใหญ่ ฉันกังวลว่าการใช้งานภายนอกอาจใช้เวลานานกว่าเงื่อนไขการเข้าร่วม 2 ด้านซ้ายสำหรับข้อมูลจำนวนมาก ทุกคนสามารถบอกได้ว่าการนำไปใช้งานได้อย่างไรและจะส่งผลต่อประสิทธิภาพการทำงานอย่างไรในข้อมูลที่มีขนาดใหญ่มากถ้าเป็นไปได้ความสัมพันธ์เชิงสัดส่วนกับขนาดของแต่ละตารางเช่นสัดส่วนกับ n1 ^ 1 หรือ n1 ^ 2 ... โดยที่ n1 คือจำนวนแถวในตาราง 1 นี่คือแบบสอบถามที่มี 2 ซ้ายเข้าร่วม select EC.*,DPD.* from Table1 eC left join ( select …

8
อะไรคือความแตกต่างระหว่าง INNER JOIN และ OUTER JOIN
ฉันยังใหม่กับ SQL และต้องการทราบว่าอะไรคือความแตกต่างระหว่างสองJOINประเภทนี้? SELECT * FROM user u INNER JOIN telephone t ON t.user_id = u.id SELECT * FROM user u LEFT OUTER JOIN telephone t ON t.user_id = u.id เมื่อใดที่ฉันควรใช้รายการใดรายการหนึ่ง
35 join 

1
การใช้คำสั่ง build ใน JOIN สามารถแนะนำอุปสรรคการเพิ่มประสิทธิภาพได้ในบางกรณี?
ฉันได้รับความสนใจว่าการUSINGสร้าง (แทนON) ในส่วนFROMคำSELECTสั่งอาจทำให้เกิดปัญหาและอุปสรรคในการเพิ่มประสิทธิภาพในบางกรณี ฉันหมายถึงคำสำคัญนี้: เลือก * จาก เข้าร่วมขโดยใช้ (a_id) ในกรณีที่ซับซ้อนมากขึ้น บริบท: ความคิดเห็นสำหรับคำถามนี้ ฉันใช้สิ่งนี้มากและไม่เคยสังเกตเห็นอะไรเลย ฉันสนใจกรณีทดสอบที่แสดงให้เห็นถึงผลกระทบหรือลิงก์ใด ๆไปยังข้อมูลเพิ่มเติม ความพยายามในการค้นหาของฉันว่างเปล่า คำตอบที่สมบูรณ์แบบจะเป็นกรณีทดสอบเพื่อแสดงUSING (a_id)ด้วยประสิทธิภาพที่ต่ำกว่าเมื่อเปรียบเทียบกับข้อเข้าร่วมทางเลือกON a.a_id = b.a_id- ถ้านั่นสามารถเกิดขึ้นได้จริง

6
จัดทำดัชนีประสิทธิภาพการทำงานเป็นเปิดเมื่อเทียบกับตำแหน่งที่
ฉันมีสองตาราง @T1 TABLE ( Id INT, Date DATETIME ) @T2 TABLE ( Id INT, Date DATETIME ) ตารางเหล่านี้มีดัชนีที่ไม่ทำคลัสเตอร์ (Id, Date) และฉันเข้าร่วมตารางเหล่านี้ SELECT * FROM T1 AS t1 INNER JOIN T2 AS t2 ON t1.Id = t2.Id WHERE t1.Date <= GETDATE() AND t2.Date <= GETDATE() สิ่งนี้สามารถเขียนเป็น SELECT * FROM T1 AS …

3
Access (Jet) SQL: DateTime stamps ใน TableB ขนาบแต่ละ DateTime stamp ใน TableA
คำแรก คุณสามารถละเว้นส่วนด้านล่าง (และรวมถึง) อย่างปลอดภัยเข้าร่วม: เริ่มต้นปิดถ้าคุณเพียงแค่ต้องการที่จะถอดรหัสรหัส พื้นหลังและผลเพียงทำหน้าที่เป็นบริบท โปรดดูประวัติการแก้ไขก่อน 2015-10-06 หากคุณต้องการดูว่ารหัสดูเหมือนเป็นครั้งแรก วัตถุประสงค์ ในท้ายที่สุดผมต้องการที่จะคำนวณพิกัด GPS หยันสำหรับเครื่องส่งสัญญาณ ( XหรือXmit) ตามแสตมป์วันที่และเวลาของข้อมูลจีพีเอสที่มีอยู่ในตารางที่ด้านข้างโดยตรงสังเกตในตารางSecondTableFirstTable เป้าหมายทันทีของฉันในการบรรลุเป้าหมายสูงสุดคือการหาวิธีเข้าร่วมFirstTableให้ดีที่สุดSecondTableเพื่อรับคะแนนเวลาขนาบข้างนั้น ต่อมาฉันสามารถใช้ข้อมูลนั้นได้ฉันสามารถคำนวณพิกัด GPS ระดับกลางโดยสมมติว่าการปรับตำแหน่งเชิงเส้นตามระบบพิกัดแบบคู่ขนาน (คำที่น่าประหลาดใจที่จะบอกว่าฉันไม่สนใจว่าโลกเป็นทรงกลมในระดับนี้) คำถาม มีวิธีที่มีประสิทธิภาพมากกว่าในการสร้างการประทับเวลาก่อนและหลังที่ใกล้เคียงที่สุดหรือไม่ แก้ไขด้วยตัวเองโดยเพียงแค่คว้า "หลัง" แล้วรับ "ก่อน" เฉพาะเมื่อมันเกี่ยวข้องกับ "หลัง" มีวิธีที่ง่ายกว่าที่ไม่เกี่ยวข้องกับ(A<>B OR A=B)โครงสร้างหรือไม่ Byrdzeyeให้ทางเลือกพื้นฐาน แต่ประสบการณ์ "โลกแห่งความจริง" ของฉันไม่ตรงกับกลยุทธ์การเข้าร่วมทั้ง 4 ของเขาที่ทำแบบเดียวกัน แต่ให้เครดิตเต็มที่กับเขาสำหรับการระบุสไตล์การเข้าร่วมอื่น ความคิดเทคนิคและคำแนะนำอื่น ๆ ที่คุณมี ดังนั้นไกลทั้งbyrdzeyeและPhrancisค่อนข้างมีประโยชน์ในเรื่องนี้ ฉันพบว่าคำแนะนำของ Phrancisถูกจัดวางอย่างยอดเยี่ยมและให้ความช่วยเหลือในช่วงวิกฤติดังนั้นฉันจะให้เขาได้เปรียบที่นี่ ฉันยังคงขอขอบคุณความช่วยเหลือเพิ่มเติมใด ๆ ที่ฉันสามารถรับได้ในเรื่องข้อ 3 Bulletpoints …

2
ใช้ SELECT ในส่วนคำสั่ง WHERE ของ SELECT อื่น
ผมได้ทำแอพลิเคชันระยะไกลร่างด้านบนของ libpq สำหรับPostrgreSQL มันทำงานได้ดี แต่ฉันได้ทำโปรไฟล์การทำงานทั่วไปของแอปพลิเคชัน สำหรับผลลัพธ์ทางธุรกิจแต่ละครั้งสุดท้ายที่ฉันผลิตมันเกิดขึ้นที่ฉันเรียกบางอย่างเช่น 40 ข้อเลือก (มากกว่า tcpip) ฉันมีการเตือนความจำจาก SQL-Server เตือนให้ฉันลดจำนวนการโต้ตอบระหว่างแอปพลิเคชันระยะไกลและฐานข้อมูล จากการวิเคราะห์การเลือกของฉันฉันคิดว่าฉันสามารถลดจำนวนนี้เป็น 3 SELECTข้อโดยใช้การรวม แต่ผมจำไม่ได้ว่าไวยากรณ์สำหรับการใช้ผลของอีกSELECTSELECT เช่น: SELECT * FROM individual INNER JOIN publisher ON individual.individual_id = publisher.individual_id WHERE individual.individual_id = 'here I would like to use the results of a another select' สิ่งนี้SELECTจะเป็นสิ่งที่เรียบง่าย: SELECT identifier FROM another_table WHERE …

2
SQL Server ไม่ปรับการรวมการผสานแบบขนานบนตารางที่แบ่งพาร์ติชันอย่างเท่าเทียมกันสองตาราง
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Exchange Administrators Stack Exchange อพยพ 7 ปีที่ผ่านมา ขออภัยล่วงหน้าสำหรับคำถามที่ละเอียดมาก ฉันได้รวมคิวรี่เพื่อสร้างชุดข้อมูลแบบเต็มสำหรับการทำซ้ำปัญหาและฉันใช้ SQL Server 2012 บนเครื่อง 32-core อย่างไรก็ตามฉันไม่คิดว่านี่เป็นเฉพาะของ SQL Server 2012 และฉันได้บังคับ MAXDOP เป็น 10 สำหรับตัวอย่างนี้โดยเฉพาะ ฉันมีสองตารางที่แบ่งพาร์ติชันโดยใช้ชุดรูปแบบพาร์ติชันเดียวกัน เมื่อรวมพวกเขาเข้าด้วยกันในคอลัมน์ที่ใช้สำหรับการแบ่งพาร์ติชันฉันสังเกตว่า SQL Server ไม่สามารถเพิ่มประสิทธิภาพการรวมแบบขนานได้มากเท่าที่คาดไว้และเลือกที่จะใช้ HASH JOIN แทน ในกรณีพิเศษนี้ฉันสามารถจำลอง MERGE JOIN ที่เหมาะสมกว่าด้วยตนเองโดยแบ่งแบบสอบถามออกเป็น 10 ช่วงแยกจากกันตามฟังก์ชันพาร์ติชันและเรียกใช้แบบสอบถามแต่ละชุดใน SSMS พร้อมกัน การใช้ WAITFOR เพื่อเรียกใช้ทั้งหมดในเวลาเดียวกันอย่างแม่นยำผลลัพธ์คือแบบสอบถามทั้งหมดทำให้เสร็จสมบูรณ์ใน ~ 40% ของเวลาทั้งหมดที่ใช้โดย HASH …

3
ฉันสามารถกำหนดค่าเริ่มต้นสำหรับการเข้าร่วมด้านนอกด้านซ้ายได้หรือไม่
สมมติว่าฉันมีตาราง a (พร้อมคอลัมน์ a1) และ b (กับคอลัมน์ b1 และ b2) และฉันดำเนินการเข้าร่วมด้านนอกด้านซ้าย SELECT * FROM a LEFT OUTER JOIN b ON a.a1 = b.b1 จากนั้น b1 และ b2 จะเป็น NULL โดยที่ค่า a1 ไม่มีค่าที่ตรงกันของ b1 ฉันสามารถให้ค่าเริ่มต้นสำหรับ b2 แทน NULL ได้หรือไม่? หมายเหตุที่เชื่อมต่อกันจะไม่ทำงานที่นี่เพราะผมไม่ต้องการให้ค่าเริ่มต้นที่จะแทนที่ NULLs ศักยภาพใน B2 ที่มีเป็นค่าของการจับคู่ a1 b1 นั่นคือด้วยและ a เป็น CREATE TABLE …
21 postgresql  join 

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