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

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

1
ทำไม LEFT JOIN นี้ถึงทำงานแย่กว่า LEAT JOIN LATERAL มากนัก?
ฉันมีตารางต่อไปนี้ (นำมาจากฐานข้อมูล Sakila): film: film_id คือ pkey นักแสดง: actor_id คือกุญแจ film_actor: film_id และ actor_id เป็น fkeys สำหรับภาพยนตร์ / นักแสดง ฉันกำลังเลือกภาพยนตร์เฉพาะเรื่อง สำหรับหนังเรื่องนี้ฉันต้องการให้นักแสดงทุกคนเข้าร่วมในภาพยนตร์เรื่องนี้ด้วย ฉันมีสองคำสั่งสำหรับการนี้: หนึ่งที่มีและเป็นหนึ่งเดียวกับLEFT JOINLEFT JOIN LATERAL select film.film_id, film.title, a.actors from film left join ( select film_actor.film_id, array_agg(first_name) as actors from actor inner join film_actor using(actor_id) group by film_actor.film_id ) …

6
เหตุใดฉันไม่สามารถใช้ค่า Null ในการเข้าร่วมได้
ฉันได้แก้ไขปัญหาการสืบค้นโดยใช้ ... row_number() over (partition by... นี่เป็นคำถามทั่วไปเพิ่มเติมเกี่ยวกับสาเหตุที่เราไม่สามารถใช้คอลัมน์ที่มีค่า Null ในการเข้าร่วมได้ เหตุใดค่าโมฆะจึงไม่เท่ากับค่าว่างเพื่อการเข้าร่วม?
13 oracle  join  null 

3
ฉันควรใช้ SQL เข้าร่วมหรือในข้อ?
ฉันมีคำถามเกี่ยวกับวิธีการที่ดีที่สุด ฉันไม่แน่ใจว่าวิธีใดดีที่สุดเมื่อข้อมูลถูกพิจารณาว่าเป็นขนาด พิจารณา 3 ตารางต่อไปนี้: พนักงาน EMPLOYEE_ID, EMP_NAME โครงการ PROJECT_ID, PROJ_NAME EMP_PROJ (มากไปหามากถึงสองตารางข้างต้น) EMPLOYEE_ID, PROJECT_ID ปัญหา : กำหนด EmployeeID ให้ค้นหาพนักงานทั้งหมดของโครงการทั้งหมดที่พนักงานคนนี้มีความเกี่ยวข้อง ฉันได้ลองทำสองวิธี .. ทั้งสองวิธีต่างกันเพียงไม่กี่มิลลิวินาทีไม่ว่าจะใช้ข้อมูลขนาดใด SELECT EMP_NAME FROM EMPLOYEE WHERE EMPLOYEE_ID IN ( SELECT EMPLOYEE_ID FROM EMP_PROJ WHERE PROJECT_ID IN ( SELECT PROJECT_ID FROM EMP_PROJ p, EMPLOYEE e WHERE p.EMPLOYEE_ID = E.EMPLOYEE_ID …
13 postgresql  join 

4
แบบสอบถามเพื่อเลือกค่าสูงสุดเมื่อเข้าร่วม
ฉันมีตารางผู้ใช้: |Username|UserType|Points| |John |A |250 | |Mary |A |150 | |Anna |B |600 | และระดับ |UserType|MinPoints|Level | |A |100 |Bronze | |A |200 |Silver | |A |300 |Gold | |B |500 |Bronze | และฉันกำลังมองหาข้อความค้นหาเพื่อให้ได้ระดับสำหรับผู้ใช้แต่ละคน บางสิ่งบางอย่างตาม: SELECT * FROM Users U INNER JOIN ( SELECT TOP 1 Level, U.UserName FROM Levels …

4
มันจะเป็นการดีกว่าหรือที่จะแยกเคียวรีใหญ่ออกเป็นเคียวรีเล็ก ๆ หลายรายการ?
มีสถานการณ์ที่ต้องมีแบบสอบถามที่ใหญ่มากเข้าร่วมหลายตารางพร้อมกับคำสั่งย่อยเลือกในพวกเขาเพื่อสร้างผลลัพธ์ที่ต้องการ คำถามของฉันคือเราควรพิจารณาใช้การสืบค้นที่เล็กกว่าหลายข้อและนำการดำเนินการทางตรรกะไปสู่ชั้นแอปพลิเคชันโดยการสอบถาม DB ในการโทรมากกว่าหนึ่งครั้ง ตัวอย่างเช่นพิจารณาแบบสอบถามต่อไปนี้: SELECT * FROM `users` WHERE `user_id` IN (SELECT f2.`friend_user_id` FROM `friends` AS f1 INNER JOIN `friends` AS f2 ON f1.`friend_user_id` = f2.`user_id` WHERE f2.`is_page` = 0 AND f1.`user_id` = "%1$d" AND f2.`friend_user_id` != "%1$d" AND f2.`friend_user_id` NOT IN (SELECT `friend_user_id` FROM `friends` WHERE `user_id` = …

1
Nest Loop vs. Hash ที่ไม่พึงประสงค์เข้าร่วมใน PostgreSQL 9.6
ฉันมีปัญหากับการวางแผนการสืบค้น PostgreSQL 9.6 ข้อความค้นหาของฉันมีลักษณะเช่นนี้: SET role plain_user; SELECT properties.* FROM properties JOIN entries_properties ON properties.id = entries_properties.property_id JOIN structures ON structures.id = entries_properties.entry_id WHERE structures."STRUKTURBERICHT" != '' AND properties."COMPOSITION" LIKE 'Mo%' AND ( properties."NAME" LIKE '%VASP-ase-preopt%' OR properties."CALCULATOR_ID" IN (7,22,25) ) AND properties."TYPE_ID" IN (6) ฉันเปิดใช้งานการรักษาความปลอดภัยระดับแถวสำหรับตารางที่ใช้งานอยู่ด้านบน ด้วยset enable_nestloop = Trueตัววางแผนคิวรีรัน …

2
[FROM x, y] หมายถึงอะไรใน Postgres
ฉันเพิ่งเริ่มต้นกับ Postgres อ่านเอกสารนี้ฉันเจอแบบสอบถามนี้: SELECT title, ts_rank_cd(textsearch, query) AS rank FROM apod, to_tsquery('neutrino|(dark & matter)') query WHERE query @@ textsearch ORDER BY rank DESC LIMIT 10; ฉันสามารถเข้าใจทุกอย่างในแบบสอบถามนี้ยกเว้นFROM apod, ...สำหรับการนี้: สิ่งนี้,หมายความว่าอย่างไร ฉันเคยเข้าร่วม แต่ไม่ได้มีหลายFROMงบคั่นด้วยเครื่องหมายจุลภาค ฉันค้นหาสุทธิโดยไม่มีประโยชน์ หลังจากดูและคิดแล้วฉันคิดว่ามันประกาศตัวแปรที่เรียกว่าแบบสอบถามเพื่อให้สามารถใช้งานได้หลายครั้ง แต่ถ้านี่เป็นเรื่องจริงมันเกี่ยวข้องกับFROMอะไร?
12 postgresql  join 

1
รวมสองตารางเหตุการณ์ไว้ในไทม์ไลน์เดียว
รับสองตาราง: CREATE TABLE foo (ts timestamp, foo text); CREATE TABLE bar (ts timestamp, bar text); ฉันต้องการที่จะเขียนแบบสอบถามว่าค่าตอบแทนts, fooและbarที่แสดงถึงมุมมองแบบครบวงจรของค่าล่าสุด กล่าวอีกนัยหนึ่งถ้าfooมี: ts | foo -------- 1 | A 7 | B และbarบรรจุ: ts | bar -------- 3 | C 5 | D 9 | E ฉันต้องการคิวรีที่ส่งคืน: ts | foo | bar -------------- 1 …

1
วิธีเพิ่มประสิทธิภาพของแบบสอบถามเพื่อให้ค้นหาในดัชนีหนึ่งก่อนจากนั้นจึงสร้างดัชนีอื่นหลังจากนั้น
ฉันมีการวัดโลกสองชุดจากข้อมูลดาวเทียมแต่ละชุดมีเขตเวลา (mjd สำหรับค่าจูเลียนเฉลี่ย) และตำแหน่งทางภูมิศาสตร์ (GeoPoint, spacial) และฉันกำลังมองหาความบังเอิญระหว่างสองชุดดังกล่าวซึ่งเวลาของพวกเขาตรงกับเกณฑ์ของ 3 ชั่วโมง (หรือ .125 วัน) และระยะทางของพวกเขาภายใน 200 กม. ของกันและกัน ฉันสร้างดัชนีสำหรับทั้งฟิลด์ mjd บนทั้งตารางและตารางเชิงพื้นที่ เมื่อฉันเพิ่งเข้าร่วมในข้อ จำกัด เวลาฐานข้อมูลจะคำนวณการแข่งขัน 100,000 ครั้งใน 8 วินาทีและคำนวณระยะทางสำหรับการแข่งขันทั้งหมด 100,000 ครั้งในเวลานั้น แบบสอบถามมีลักษณะดังนี้: select top 100000 h.Time, m.Time, h.GeoPoint.STDistance(m.GeoPoint)/1000.0 from L2V5.dbo.header h join L2.dbo.MLS_Header m on h.mjd between m.mjd-.125 and m.mjd+.125 option( table hint …


3
วิธีที่เร็วที่สุดในการนับจำนวนช่วงวันที่ครอบคลุมแต่ละวันจากซีรี่ส์
ฉันมีตาราง (ใน PostgreSQL 9.4) ที่มีลักษณะเช่นนี้: CREATE TABLE dates_ranges (kind int, start_date date, end_date date); INSERT INTO dates_ranges VALUES (1, '2018-01-01', '2018-01-31'), (1, '2018-01-01', '2018-01-05'), (1, '2018-01-03', '2018-01-06'), (2, '2018-01-01', '2018-01-01'), (2, '2018-01-01', '2018-01-02'), (3, '2018-01-02', '2018-01-08'), (3, '2018-01-05', '2018-01-10'); ตอนนี้ฉันต้องการคำนวณสำหรับวันที่ที่กำหนดและสำหรับทุกประเภทว่ามีกี่แถวจากdates_rangesแต่ละวันที่ตก อาจตัดศูนย์ได้ ผลลัพธ์ที่ต้องการ: +-------+------------+----+ | kind | as_of_date | n | …

4
วิธีรับกลุ่มที่การนับเป็นศูนย์ได้อย่างไร
ฉันจะพยายามสร้างกราฟจากข้อมูลจากฐานข้อมูลเซิร์ฟเวอร์ SQL ของฉัน ฉันจะมีถนนทุกเส้นที่มีจำนวนผู้ใช้ที่อาศัยอยู่บนถนนเส้นนี้แม้จำนวนนั้นจะเป็นศูนย์ สำหรับสิ่งนี้ฉันได้ลองใช้แบบสอบถามนี้: Create table Streets( ID int IDENTITY primary key, Name varchar(100) ); create table users( ID int IDENTITY primary key, Username varchar(100), StreetID int references Streets(id) ); insert into streets values ('1st street'), ('2nd street'), ('3rd street'), ('4th street'), ('5th street'); insert into users values ('Pol', …

2
แบบสอบถาม SQL เข้าร่วมเพื่อแสดงแถวที่ไม่มีแถวในหนึ่งตาราง
ฉันกำลังพยายามทำให้การรายงานบางอย่างเสร็จสิ้นเพื่อบันทึกเวลาของพนักงาน เรามีสองตารางสำหรับคำถามนี้โดยเฉพาะ พนักงานมีการระบุไว้ในMembersตารางและในแต่ละวันพวกเขาป้อนรายการเวลาของงานที่พวกเขาทำและถูกเก็บไว้ในTime_Entryตาราง ตัวอย่างการตั้งค่าด้วย SQL Fiddle: http://sqlfiddle.com/#!3/e3806/7 ผลลัพธ์ที่ฉันจะให้เป็นตารางซึ่งแสดงให้เห็นทั้งหมดMembersในรายการคอลัมน์และจากนั้นจะแสดงชั่วโมงรวมของพวกเขาสำหรับวันที่สอบถามในคอลัมน์อื่น ๆ ปัญหาดูเหมือนว่าถ้าไม่มีแถวในTime_Entryตารางสำหรับสมาชิกเฉพาะตอนนี้มีแถวสำหรับสมาชิกนั้น ฉันได้ลองประเภทการเข้าร่วมหลายประเภท (ซ้าย, ขวา, ด้านใน, ด้านนอก, ด้านนอกเต็ม, ฯลฯ ) แต่ดูเหมือนว่าจะไม่มีสิ่งใดที่ฉันต้องการซึ่งจะเป็น (ตามตัวอย่างล่าสุดในซอฟแวร์ SQL Fiddle): /*** Desired End Result ***/ Member_ID | COUNTTime_Entry | TIMEENTRYDATE | SUMHOURS_ACTUAL | SUMHOURS_BILL ADavis | 0 | 11-10-2013 | 0 | 0 BTronton | 0 | 11-10-2013 …

2
ทำไมการวนซ้ำซ้อนกันจึงสนับสนุนเฉพาะการรวมซ้ายเท่านั้น
ในบล็อกของ Craig Freedman เข้าร่วม Nested Loops Joinเขาอธิบายว่าทำไมการเข้าร่วม loops แบบซ้อนไม่สามารถรองรับการเข้าร่วมด้านนอกที่ถูกต้อง: ปัญหาคือเราสแกนตารางด้านในหลาย ๆ ครั้ง - หนึ่งครั้งสำหรับแต่ละแถวของการรวมภายนอก เราอาจพบแถวภายในเดียวกันหลายครั้งในระหว่างการสแกนหลายครั้ง เราสามารถสรุปได้ว่าจุดภายในแถวใดแถวหนึ่งไม่ได้หรือจะไม่เข้าร่วม? ใครช่วยอธิบายสิ่งนี้ด้วยวิธีที่ง่ายและให้ความรู้ได้จริงหรือ? หมายความว่าการวนรอบเริ่มต้นด้วยตารางด้านนอก ( R1) และการสแกนด้านใน ( R2) หรือไม่ ฉันเข้าใจว่าสำหรับR1ค่าที่ไม่ได้เข้าร่วมR2ควรแทนที่ด้วยNULLชุดผลลัพธ์จึงกลายเป็น ( NULL, R2) สำหรับฉันดูเหมือนว่าเป็นไปไม่ได้ที่จะคืนR2ค่าเมื่อR1ไม่ได้เข้าร่วมด้วยเหตุผลที่ไม่สามารถรู้ว่าR2จะคืนค่าใด แต่นั่นไม่ใช่วิธีที่อธิบาย หรือมันคืออะไร? ในความเป็นจริง SQL Server จะปรับให้เหมาะสม (และมักจะแทนที่) RIGHT JOINด้วยLEFT JOINแต่คำถามคือเพื่ออธิบายว่าทำไมมันเป็นไปไม่ได้ทางเทคนิคสำหรับตรรกะNESTED LOOPS JOINการใช้งาน / การสนับสนุนRIGHT JOIN

2
MySQL ไม่ได้ใช้ดัชนีเมื่อเข้าร่วมกับตารางอื่น
ฉันมีสองตารางตารางแรกประกอบด้วยบทความ / บล็อกโพสต์ทั้งหมดภายใน CMS บทความเหล่านี้บางส่วนอาจปรากฏในนิตยสารซึ่งในกรณีนี้พวกเขามีความสัมพันธ์กับต่างประเทศที่สำคัญกับตารางอื่นที่มีข้อมูลเฉพาะของนิตยสาร นี่คือเวอร์ชันที่เรียบง่ายของไวยากรณ์การสร้างตารางสำหรับสองตารางเหล่านี้ที่มีแถวที่ไม่จำเป็นออกมา: CREATE TABLE `base_article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date_published` datetime DEFAULT NULL, `title` varchar(255) NOT NULL, `description` text, `content` longtext, `is_published` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `base_article_date_published` (`date_published`), KEY `base_article_is_published` (`is_published`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `mag_article` ( …

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