คิดในแง่ของเซตไม่ใช่ตัววนซ้ำ คำสั่ง sql กำหนดคุณสมบัติของชุดผลลัพธ์ที่ต้องการ (aka ตาราง / ความสัมพันธ์)
สถานที่จัดงานทั้งหมดชื่อเช่นนั้นสำหรับทุก ๆ วงประเทศจะมีวงดนตรีจากประเทศนั้น ๆ ที่เล่นในสถานที่ของชื่อนั้น
ผลลัพธ์ของสิ่งนี้ (ถ้าฉันเข้าใจความตั้งใจของคุณอย่างถูกต้อง!) จะเป็นกลุ่มของสถานที่ที่มีวงดนตรีอย่างน้อยหนึ่งวงที่เล่นในสถานที่นั้น การทำซ้ำใน bandCountry นั้นไม่จำเป็นเนื่องจากความสัมพันธ์ของ PLAYS มีข้อมูลที่คุณต้องการอยู่แล้วคุณเพียงกำจัดรายการที่ซ้ำกัน
ดังนั้นใน SQL สิ่งนี้จะเป็น:
select
distinct venueName
from PLAYS
แก้ไข: ตกลงดังนั้นชุดจริงที่ต้องการนั้นซับซ้อนกว่าเล็กน้อย คำถามที่ถูกถามเกี่ยวกับฐานข้อมูลคือ: สถานที่ใดมีวงดนตรีที่โฮสต์จากทุกประเทศ?
ดังนั้นเราจึงกำหนดเกณฑ์ความเป็นสมาชิกสำหรับองค์ประกอบของชุดที่ต้องการเป็นเป้าหมายจากนั้นทำงานย้อนกลับเพื่อเติมข้อมูลชุด สถานที่เป็นสมาชิกของชุดผลลัพธ์หากมีแถว PLAYS สำหรับวงดนตรีอย่างน้อยหนึ่งวงจากทุกประเทศ เราจะรับข้อมูลนี้ได้อย่างไร
วิธีหนึ่งคือการนับประเทศที่แตกต่างกันสำหรับแต่ละสถานที่และเปรียบเทียบกับจำนวนประเทศทั้งหมด แต่เราไม่มีความสัมพันธ์ในประเทศ หากเราคิดถึงแบบจำลองที่ให้มาสักครู่เราจะเห็นว่าชุดของทุกประเทศไม่ใช่เกณฑ์ที่ถูกต้อง มันเป็นฉากของทุกประเทศที่มีวงดนตรีอย่างน้อยหนึ่งวง ดังนั้นเราจึงไม่จำเป็นต้องใช้ตารางประเทศ (สำหรับแบบจำลองมาตรฐานที่เราควรมี) และเราไม่สนใจประเทศของสถานที่จัดงานเราสามารถนับประเทศที่มีแถบเช่น (ใน MS-SQL )
declare @BandCountryCount int
select
@BandCountryCount = COUNT(distinct bandCountry)
from BAND
เราสามารถนับประเทศของวงดนตรีสำหรับแต่ละสถานที่ได้
select
P.venueName, COUNT(distinct B.bandCountry) as VenueBandCountryCount
from PLAYS P
inner join BAND B on B.bandName = P.bandName
และเราสามารถแยกชิ้นส่วนทั้งสองเข้าด้วยกันโดยใช้แบบสอบถามย่อย
select
venueName
from (
select
P.venueName, COUNT(distinct B.bandCountry) as VenueBandCountryCount
from PLAYS P
inner join BAND B on B.bandName = P.bandName
) X
where X.VenueBandCountryCount = @BandCountryCount
ตอนนี้นั่นไม่ใช่แบบสอบถามที่สวยที่สุดเท่าที่จะเป็นไปได้ (GROUP BY และ HAVING อาจได้รับการพิจารณาว่าเป็นวิธีที่ 'สวยงาม' มากกว่าตัวแปร temp และแบบสอบถามย่อย) แต่ก็ชัดเจนว่าเราอยู่ข้างหลังอะไร .
จุดประสงค์ของ OP คือเพื่อเรียนรู้วิธีเปลี่ยนความคิดจากสิ่งจำเป็นเป็นสิ่งที่เปิดเผย ด้วยเหตุนี้ให้ดูที่วิธีแก้ปัญหาที่จำเป็นที่อธิบายไว้กำลังทำอะไรอยู่:
สำหรับแต่ละสถานที่ชื่อซ้ำกับ bandCount ทั้งหมดและสำหรับแต่ละ bandCountry จะได้รับรายชื่อของวงดนตรีที่มาจากมัน หากไม่มีคนใดในสถานที่ให้ไปที่ชื่อสถานที่ต่อไป อื่น ๆ ในตอนท้ายของการทำซ้ำ bandCountries เพิ่ม venueName ไปยังชุดของสถานที่ที่ดีชื่อ
เกณฑ์การพิจารณาในข้างต้นคืออะไร? ฉันคิดว่ามันคือ:
... หากไม่มีพวกเขา [กลุ่มของวงดนตรีจากประเทศใดประเทศหนึ่ง] เล่นในสถานที่จัดงาน ...
นี้เป็นเกณฑ์สิทธ์ กระบวนการคิดที่จำเป็นจะเริ่มต้นด้วยที่ฝากข้อมูลเต็มรูปแบบและทิ้งสิ่งที่ไม่ตรงกับเกณฑ์ เรากำลังกรองข้อมูล
ไม่เป็นไรสำหรับสิ่งที่เรียบง่าย แต่ช่วยในการคิดในการสร้างชุดผลลัพธ์ที่ต้องการ เกณฑ์การคัดเลือกที่สอดคล้องกันที่จะอนุญาตให้หนึ่งเติมที่ฝากข้อมูลแทนคืออะไร
- ผู้ถูกตัดสิทธิ์: หากไม่มีวงดนตรีจากวงประเทศที่เล่นในสถานที่แสดงสถานที่นั้นจะถูกตัดสิทธิ์
- รอบคัดเลือก (บางส่วน): หากมีอย่างน้อยหนึ่งวงจาก bandCountry เล่นในสถานที่แสดงว่าสถานที่นั้นอาจใช้ได้ ตรวจสอบส่วนที่เหลือของ bandCount ต่อไป
- (เต็ม) รอบคัดเลือก: หากมีวงดนตรีอย่างน้อยหนึ่งวงจากแต่ละวงประเทศเล่นในสถานที่แสดงว่าสถานที่นั้นผ่านการรับรองแล้ว
รอบคัดเลือกสุดท้ายสามารถทำให้ง่ายขึ้นโดยใช้การนับ: bandCountry คือ 'พอใจ' ถ้ามีวงดนตรีอย่างน้อยหนึ่งวงจากที่นั่นเล่นในสถานที่จัดงาน จำนวนประเทศในแถบ 'พอใจ' สำหรับสถานที่จัดงานจะต้องเท่ากับจำนวนประเทศในแถบของสถานที่ที่จะมีคุณสมบัติ
ตอนนี้เราสามารถให้เหตุผลกับความสัมพันธ์โดยการนำทาง:
- เริ่มต้นด้วยความสัมพันธ์แบบ VENUE [เราไม่ต้องการคำตอบ แต่เป็นจุดเริ่มต้นของแนวคิดสำหรับการนำทางเชิงสัมพันธ์]
- เข้าร่วม PLAYS ในหน้าชื่อ
- เข้าร่วมกับ BAND ใน bandName เพื่อรับ bandCountry
- เราไม่สนใจชื่อวง เลือกเฉพาะชื่อสถานที่และ bandCountry
- เราไม่สนใจเกี่ยวกับ bandCount ซ้ำซ้อน; กำจัดรายการที่ซ้ำกันโดยใช้ DISTRICT หรือ GROUP BY
- เราใส่ใจเฉพาะการนับจำนวน bandCountries ที่แตกต่างกันไม่ใช่ชื่อ
- เราต้องการเฉพาะสถานที่ที่นับ bandCountries แตกต่างกันเท่ากับจำนวน bandCountries ทั้งหมด
ซึ่งนำกลับไปแก้ปัญหาข้างต้น (หรือโทรสารที่เหมาะสมของมัน)
สรุป
- ทฤษฎีเซต
- เส้นทางการนำทางเชิงสัมพันธ์
- รวมกับเกณฑ์พิเศษเฉพาะ (มีคุณสมบัติเทียบกับตัดสิทธิ์)