suy nghĩ về các bộ, không lặp; các câu lệnh sql xác định các thuộc tính của tập hợp đầu ra mong muốn (còn gọi là bảng / quan hệ)
tất cả các địa điểm Tên như vậy cho mỗi ban nhạc. Có một ban nhạc từ quốc gia đó chơi ở địa điểm đó
kết quả của việc này (nếu tôi hiểu chính xác ý định của bạn!) sẽ là tập hợp các địa điểm có ít nhất một ban nhạc chơi ở địa điểm đó. Việc lặp lại trên bandCountry là không cần thiết, vì mối quan hệ PLAYS đã có thông tin mà bạn tìm kiếm, bạn chỉ cần loại bỏ các bản sao
Vì vậy, trong SQL, đây sẽ là:
select
distinct venueName
from PLAYS
EDIT: ok, vì vậy bộ thực tế mong muốn phức tạp hơn một chút. Câu hỏi đang được hỏi về cơ sở dữ liệu là: địa điểm nào đã tổ chức các ban nhạc từ tất cả các quốc gia?
Vì vậy, chúng tôi xác định tiêu chí thành viên cho một yếu tố của tập hợp mong muốn làm mục tiêu, sau đó làm việc ngược lại để đưa vào tập hợp. Địa điểm là thành viên của tập hợp đầu ra nếu nó có hàng PLAYS cho ít nhất một ban nhạc từ mọi quốc gia. Làm thế nào để chúng ta có được thông tin này?
Một cách là đếm các quốc gia riêng biệt cho từng địa điểm và so sánh nó với số lượng của tất cả các quốc gia. Nhưng chúng tôi không có mối quan hệ QUỐC GIA. Nếu chúng ta nghĩ về mô hình được đưa ra trong một thời điểm, chúng ta thấy rằng tập hợp của tất cả các quốc gia không phải là tiêu chí phù hợp; đó là tập hợp tất cả các quốc gia có ít nhất một ban nhạc. Vì vậy, chúng tôi không cần một bảng quốc gia (mặc dù đối với mô hình được chuẩn hóa, chúng tôi nên có một bảng) và chúng tôi không quan tâm đến quốc gia của địa điểm, chúng tôi chỉ có thể đếm các quốc gia có các ban nhạc, ví dụ: (trong MS-SQL )
declare @BandCountryCount int
select
@BandCountryCount = COUNT(distinct bandCountry)
from BAND
Chúng tôi có thể đếm các quốc gia ban nhạc cho từng địa điểm
select
P.venueName, COUNT(distinct B.bandCountry) as VenueBandCountryCount
from PLAYS P
inner join BAND B on B.bandName = P.bandName
và chúng ta có thể ghép hai người lại với nhau bằng cách sử dụng một truy vấn con
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
Bây giờ, đó không phải là truy vấn đẹp nhất có thể (NHÓM THEO và HAVING có thể được coi là một giải pháp 'thanh lịch' hơn các biến tạm thời và một truy vấn phụ) nhưng rõ ràng chúng ta sẽ để nó theo mục đích của OP .
Mục đích của OP là học cách chuyển suy nghĩ từ mệnh lệnh sang khai báo. Cuối cùng, hãy nhìn vào những gì giải pháp bắt buộc được mô tả đang làm:
cho mỗi địa điểm Tên lặp đi lặp lại trên tất cả các bandCountries và cho mỗi bandCountry có được danh sách các ban nhạc xuất phát từ đó. Nếu không ai trong số họ chơi trong địa chỉName, hãy đến địa chỉ tiếp theo. Khác, ở cuối ban nhạc Lặp đi lặp lại thêm địa điểm Tên vào tập hợp địa điểm tốtNames
Các tiêu chí xác định ở trên là gì? Tôi nghĩ rằng nó là:
... Nếu không ai trong số họ [nhóm các ban nhạc từ một quốc gia cụ thể] chơi ở địa điểm ...
Đây là một tiêu chí không đạt chuẩn . Quá trình suy nghĩ cấp bách đang bắt đầu với một thùng đầy đủ và loại bỏ những thứ không phù hợp với tiêu chí. Chúng tôi đang lọc dữ liệu.
Điều đó tốt cho những thứ đơn giản, nhưng nó giúp suy nghĩ về mặt xây dựng tập kết quả mong muốn; các tiêu chí đủ điều kiện tương ứng sẽ cho phép một người điền vào thùng thay thế là gì?
- người không đủ tiêu chuẩn: nếu không có ban nhạc từ ban nhạcCountry chơi tại một địa điểm, địa điểm đó sẽ bị loại
- (một phần) vòng loại: nếu có ít nhất một ban nhạc từ một ban nhạcCountry chơi tại một địa điểm, thì địa điểm đó có thể ổn; tiếp tục kiểm tra phần còn lại của bandCountries
- (đầy đủ) vòng loại: nếu có ít nhất một ban nhạc từ mỗi ban nhạcCountry phát tại một địa điểm, thì địa điểm đó đủ điều kiện
Vòng loại cuối cùng có thể được đơn giản hóa bằng cách sử dụng số lượng: một bandCountry được 'hài lòng' nếu có ít nhất một ban nhạc từ đó chơi tại một địa điểm; số lượng quốc gia ban nhạc 'hài lòng' cho một địa điểm phải bằng số lượng quốc gia của ban nhạc để địa điểm đó đủ điều kiện.
Bây giờ chúng ta có thể lý luận qua các mối quan hệ bằng cách điều hướng:
- bắt đầu với mối quan hệ VENUE [chúng tôi không cần nó cho câu trả lời, nhưng đó là điểm bắt đầu khái niệm cho điều hướng quan hệ]
- tham gia CHƠI trên địa điểm
- tham gia BAND trên bandName để nhận bandCountry
- chúng tôi không quan tâm đến tên ban nhạc; chỉ chọn địa điểmName và bandCountry
- chúng tôi không quan tâm đến bandCountries dư thừa; loại bỏ trùng lặp bằng cách sử dụng DISTRICT hoặc GROUP BY
- chúng tôi chỉ quan tâm đến số lượng bandCountries riêng biệt, không phải tên
- chúng tôi chỉ muốn các địa điểm có số lượng bandCountries khác nhau bằng tổng số bandCountries
dẫn đến giải pháp ở trên (hoặc một bản fax hợp lý)
TÓM LƯỢC
- đặt lý thuyết
- đường dẫn điều hướng quan hệ
- bao gồm so với tiêu chí độc quyền (đủ điều kiện vs không đủ tiêu chuẩn)