ก่อนอื่นให้ถือว่านั่น(id)
คือคีย์หลักของตาราง ในกรณีนี้ใช่การรวมกัน (สามารถพิสูจน์ได้) ซ้ำซ้อนและสามารถกำจัดได้
ตอนนี้เป็นเพียงแค่ทฤษฎีหรือคณิตศาสตร์ เพื่อให้เครื่องมือเพิ่มประสิทธิภาพทำการกำจัดจริงทฤษฎีต้องถูกแปลงเป็นรหัสและเพิ่มเข้าไปในชุดการเพิ่มประสิทธิภาพ / การเขียนใหม่ / การคัดออกของชุดเพิ่มประสิทธิภาพ สำหรับสิ่งที่จะเกิดขึ้นนักพัฒนา (DBMS) จะต้องคิดว่ามันจะมีประโยชน์ที่ดีต่อประสิทธิภาพและนั่นเป็นกรณีที่พบได้ทั่วไป
โดยส่วนตัวมันฟังดูไม่เหมือน (ธรรมดาพอ) แบบสอบถาม - ตามที่คุณยอมรับ - ดูค่อนข้างงี่เง่าและผู้ตรวจทานไม่ควรปล่อยให้ผ่านการตรวจสอบเว้นแต่จะได้รับการปรับปรุงและลบการเข้าร่วมซ้ำซ้อน
ที่กล่าวว่ามีคำถามที่คล้ายกันซึ่งการกำจัดจะเกิดขึ้น มีโพสต์บล็อกที่ดีมากที่เกี่ยวข้องโดย Rob ลี่ย์คือJOIN ความเรียบง่ายใน SQL Server
ในกรณีของเราสิ่งที่เราต้องทำในการเปลี่ยนการรวมเป็นการLEFT
รวม ดูdbfiddle.uk เครื่องมือเพิ่มประสิทธิภาพในกรณีนี้รู้ว่าสามารถลบการเข้าร่วมได้อย่างปลอดภัยโดยไม่ต้องเปลี่ยนผลลัพธ์ (ตรรกะการทำให้เข้าใจง่ายเป็นเรื่องทั่วไปและไม่ได้เป็นกรณีพิเศษสำหรับการรวมตัวเอง)
ในคิวรีดั้งเดิมของหลักสูตรการลบการINNER
รวมอาจไม่สามารถเปลี่ยนผลลัพธ์ได้เช่นกัน แต่มันก็ไม่ธรรมดาเลยที่จะเข้าร่วมด้วยตนเองในคีย์หลักดังนั้นเครื่องมือเพิ่มประสิทธิภาพจึงไม่ได้นำกรณีนี้ไปใช้ เป็นเรื่องปกติที่จะเข้าร่วม (หรือเข้าร่วมด้านซ้าย) โดยที่คอลัมน์รวมเป็นคีย์หลักของหนึ่งในตาราง (และมักจะมีข้อ จำกัด ของคีย์ต่างประเทศ) ซึ่งนำไปสู่ตัวเลือกที่สองเพื่อกำจัดการรวม: เพิ่มข้อ จำกัด foreign key (การอ้างอิงตัวเอง!):
ALTER TABLE "Table"
ADD FOREIGN KEY (id) REFERENCES "Table" (id) ;
และ voila การรวมจะถูกกำจัด! (ทดสอบในซอเดียวกัน): ที่นี่
create table docs
(id int identity primary key,
doc varchar(64)
) ;
GO
✓
insert
into docs (doc)
values ('Enter one batch per field, don''t use ''GO''')
, ('Fields grow as you type')
, ('Use the [+] buttons to add more')
, ('See examples below for advanced usage')
;
GO
ได้รับผลกระทบ 4 แถว
--------------------------------------------------------------------------------
-- Or use XML to see the visual representation, thanks to Justin Pealing and
-- his library: https://github.com/JustinPealing/html-query-plan
--------------------------------------------------------------------------------
set statistics xml on;
select d1.* from docs d1
join docs d2 on d2.id=d1.id
join docs d3 on d3.id=d1.id
join docs d4 on d4.id=d1.id;
set statistics xml off;
GO
id | คุณหมอ
-: | : ----------------------------------------
1 | ป้อนหนึ่งชุดต่อฟิลด์อย่าใช้ 'GO'
2 | เขตข้อมูลเติบโตในขณะที่คุณพิมพ์
3 | ใช้ปุ่ม [+] เพื่อเพิ่มมากขึ้น
4 | ดูตัวอย่างด้านล่างสำหรับการใช้งานขั้นสูง
--------------------------------------------------------------------------------
-- Or use XML to see the visual representation, thanks to Justin Pealing and
-- his library: https://github.com/JustinPealing/html-query-plan
--------------------------------------------------------------------------------
set statistics xml on;
select d1.* from docs d1
left join docs d2 on d2.id=d1.id
left join docs d3 on d3.id=d1.id
left join docs d4 on d4.id=d1.id;
set statistics xml off;
GO
id | คุณหมอ
-: | : ----------------------------------------
1 | ป้อนหนึ่งชุดต่อฟิลด์อย่าใช้ 'GO'
2 | เขตข้อมูลเติบโตในขณะที่คุณพิมพ์
3 | ใช้ปุ่ม [+] เพื่อเพิ่มมากขึ้น
4 | ดูตัวอย่างด้านล่างสำหรับการใช้งานขั้นสูง
alter table docs
add foreign key (id) references docs (id) ;
GO
✓
--------------------------------------------------------------------------------
-- Or use XML to see the visual representation, thanks to Justin Pealing and
-- his library: https://github.com/JustinPealing/html-query-plan
--------------------------------------------------------------------------------
set statistics xml on;
select d1.* from docs d1
join docs d2 on d2.id=d1.id
join docs d3 on d3.id=d1.id
join docs d4 on d4.id=d1.id;
set statistics xml off;
GO
id | คุณหมอ
-: | : ----------------------------------------
1 | ป้อนหนึ่งชุดต่อฟิลด์อย่าใช้ 'GO'
2 | เขตข้อมูลเติบโตในขณะที่คุณพิมพ์
3 | ใช้ปุ่ม [+] เพื่อเพิ่มมากขึ้น
4 | ดูตัวอย่างด้านล่างสำหรับการใช้งานขั้นสูง