Thật đơn giản-
SELECT empname,
empid,
(SELECT COUNT (profileid)
FROM profile
WHERE profile.empid = employee.empid)
AS number_of_profiles
FROM employee;
Nó thậm chí còn đơn giản hơn khi bạn sử dụng một phép nối bảng như thế này:
SELECT e.empname, e.empid, COUNT (p.profileid) AS number_of_profiles
FROM employee e LEFT JOIN profile p ON e.empid = p.empid
GROUP BY e.empname, e.empid;
Giải thích cho truy vấn con:
Về cơ bản, một truy vấn con trong select
nhận một giá trị vô hướng và chuyển nó đến truy vấn chính. Một truy vấn con trong select
không được phép vượt qua nhiều hơn một hàng và nhiều hơn một cột, đó là một hạn chế. Ở đây, chúng tôi đang chuyển một count
đối với truy vấn chính, như chúng ta biết, sẽ luôn chỉ là một số - một giá trị vô hướng. Nếu không tìm thấy giá trị, truy vấn con trả về null
cho truy vấn chính. Hơn nữa, một truy vấn con có thể truy cập các cột từ from
mệnh đề của truy vấn chính, như được hiển thị trong truy vấn của tôi, nơi employee.empid
được chuyển từ truy vấn bên ngoài sang truy vấn bên trong.
Chỉnh sửa :
Khi bạn sử dụng truy vấn con trong select
, về cơ bản Oracle coi nó như một phép nối bên trái (bạn có thể thấy điều này trong sơ đồ giải thích cho truy vấn của mình), với số lượng các hàng chỉ là một ở bên phải cho mọi hàng ở bên trái.
Giải thích cho phép nối bên trái
Một phép nối bên trái rất tiện dụng, đặc biệt khi bạn muốn thay thế select
truy vấn con do các hạn chế của nó. Ở đây không có giới hạn nào về số hàng của bảng ở hai bên của LEFT JOIN
từ khóa.
Để biết thêm thông tin, hãy đọc Tài liệu Oracle trên các truy vấn con và kết nối trái hoặc kết nối ngoài cùng.