2012-04-10 28 views
5

Tôi đang đi qua một bài báo trước đây cho một khóa học cơ sở dữ liệu tôi tham gia và tôi đang bị mắc kẹt trên một câu hỏi SQLCách viết truy vấn "độc quyền" trong SQL?

Dưới đây là sơ đồ cung cấp

  • quốc gia (tên, vốn, khu vực), tên là chìa khóa

  • Mọi người (quốc gia, dân số, trẻ em, người lớn) nơi quốc gia đề cập đến tên ở Quốc gia, dân số là tổng dân số và trẻ em và người lớn là phần trăm trẻ em và người lớn.

  • Ngôn ngữ (quốc gia, ngôn ngữ, tỷ lệ phần trăm) - cho mỗi ngôn ngữ được nói ở quốc gia , nó liệt kê phần trăm dân số nói ngôn ngữ.

Đây là câu hỏi:

Viết truy vấn sau trong SQL: Tìm ngôn ngữ mà là chỉ nói trong nước có dân số vượt quá 10^7.

Đây là những gì tôi có cho đến nay:

SELECT l.language 
FROM people p, language l 
WHERE l.country = p.country AND 
    p.population > 10^7 

Bit Tôi đang bối rối về là làm thế nào để kiểm tra rằng không có nước khác mà một ngôn ngữ được nói trong nhưng dân số ít hơn 10^7.

Bạn có lời khuyên nào không? Cảm ơn

+0

Vì đây là dành cho DB c ourse, bạn nên đọc trên cú pháp nối đúng. Những gì bạn đang sử dụng là cũ/lỗi thời (nhưng vẫn còn chức năng) ký hiệu, và tôi gọi nó là "cú pháp lười biếng". –

+0

"Chỉ hơn X" có nghĩa là "Không có gì nhỏ hơn hoặc bằng X" –

+0

Một điều phô trương (mà tôi nghĩ câu hỏi này đang nhận được) là, đối với bất kỳ ngôn ngữ cụ thể nào, hãy tự hỏi: bao nhiêu quốc gia được nói đến, và có bao nhiêu nước trong số đó có> dân số X? Hoặc bạn có thể tự hỏi: "Nếu tôi có hai bảng, một bảng với dân số quốc gia> X, cái kia

Trả lời

4

Tải tất cả ngôn ngữ. Từ tập hợp đó, xóa tất cả ngôn ngữ được nói ở các quốc gia có dân số < = 10^7. Lời nhắc phải là ngôn ngữ chỉ được nói ở các quốc gia có dân số> 10^7.

select language from languages 
where language not in (
    select language from languages l 
    join people p on l.country = p.country 
    where p.population <= 10^7) 

này hoạt động trên cơ sở đó thiết kế của bạn có những hạn chế mà mỗi ngôn ngữ phải được nói trong ít nhất một quốc gia;)

+0

Đây là một cách, nhưng một cách mà (trong kinh nghiệm hạn chế của tôi) là * không * được dạy như là giải pháp cổ điển/học thuật bởi vì nó sử dụng một lựa chọn phụ. –

+0

"Điều này làm việc trên cơ sở ..." - Tôi không nghĩ đó là một giả định an toàn! – onedaywhen

+1

Nếu bạn muốn một giải pháp không có truy vấn phụ, hãy sử dụng MINUS để kết hợp hai SELECT. –

1
WITH T 
    AS 
    (
     SELECT l.language, 
      p.country, p.population 
     FROM people p, language l 
     WHERE l.country = p.country 
    ) 
SELECT language 
    FROM T 
EXCEPT 
SELECT language 
    FROM T 
WHERE population <= 10000000; 

Hoặc:

SELECT language 
    FROM language AS l1 
WHERE 10000000 < (SELECT MIN(p.population) 
         FROM people p, language l 
        WHERE l.country = p.country 
          AND l.language = l1.language); 

Tương tự:

SELECT language 
    FROM language AS l1 
WHERE 10000000 < ALL (SELECT p.population 
          FROM people p, language l 
         WHERE l.country = p.country 
           AND l.language = l1.language); 
Các vấn đề liên quan