2013-03-06 64 views
10

Tôi có bảng cho Nhân viên và một bảng khác với Đào tạo. Bảng đào tạo có các lớp đào tạo khác nhau mà các nhân viên đã hoàn thành. Chúng tôi có đào tạo nâng cao nhận thức bảo mật bắt buộc, do đó, mỗi nhân viên phải hoàn thành lớp đào tạo này. Tôi gặp sự cố khi chạy truy vấn sẽ trả về TẤT CẢ nhân viên hoặc được liệt kê hoàn thành việc đào tạo hay không.Truy vấn SQL từ một đến nhiều mối quan hệ

Ví dụ nhân viên bảng bảng

╔════╦══════╗ 
║ ID ║ NAME ║ 
╠════╬══════╣ 
║ 1 ║ Bob ║ 
║ 2 ║ Tom ║ 
║ 3 ║ John ║ 
╚════╩══════╩ 

Ví dụ Đào tạo

╔════╦══════════════╦════════════════════╗ 
║ ID ║ DEPARTMENT_ID║  CLASS  ║ 
╠════╬══════════════╬════════════════════╣ 
║ 1 ║   1 ║ Security Awareness ║ 
║ 2 ║   1 ║ Workplace Safety ║ 
║ 3 ║   2 ║ Security Awareness ║ 
╚════╩══════════════╩════════════════════╝ 

Target dẫn

╔════╦══════╦════════════════════╗ 
║ ID ║ NAME ║  CLASS  ║ 
╠════╬══════╬════════════════════╣ 
║ 1 ║ Bob ║ Security Awareness ║ 
║ 2 ║ Tom ║ Security Awareness ║ 
║ 3 ║ John ║ (null)    ║ 
╚════╩══════╩════════════════════╝ 

Các truy vấn mà tôi đang sử dụng là

SELECT employee.id, employee.name, training.class 
FROM employee 
JOIN training ON employee.id = training.department_id 
WHERE training.class LIKE '%SECURITY%' 
ORDER BY employee_id 

Nhân viên bị thiếu lớp "Nhận thức bảo mật" chỉ không xuất hiện và rơi qua các vết nứt.

+1

là department_id bằng employee.id? – Maciej

Trả lời

10

sử dụng LEFT JOIN và di chuyển các điều kiện lọc trong việc gia nhập của bảng (cụ thể trong ON khoản)

Một mối quan tâm là sử dụng dấu ngoặc đơn: ' ' không ‘ ’

SELECT employee.id, 
     employee.name, training.class 
FROM employee 
     LEFT JOIN training 
      ON employee.id = training.department_id AND 
       training.class LIKE '%SECURITY%' 
ORDER BY employee.id 

KẾT QUẢ

╔════╦══════╦════════════════════╗ 
║ ID ║ NAME ║  CLASS  ║ 
╠════╬══════╬════════════════════╣ 
║ 1 ║ Bob ║ Security Awareness ║ 
║ 2 ║ Tom ║ Security Awareness ║ 
║ 3 ║ John ║ (null)    ║ 
╚════╩══════╩════════════════════╝ 
+3

Rất tuyệt, tôi không biết tôi có thể lọc trong phần nối. Điều này cũng sẽ giúp ích trong các lĩnh vực khác. – Rich

+0

tôi có ở đây giải thích khác http://stackoverflow.com/a/15205900/491243 –

1

Bạn đang thực hiện một kết nối bên trong, những gì bạn muốn là một tham gia bên ngoài bên trái. Sự khác biệt là: kết nối bên trong sẽ chỉ chỉ kết quả trong đó có kết quả phù hợp trong bảng đã tham gia. Một phép nối ngoài bên trái sẽ trả về tất cả các kết quả từ bảng chính, cho dù có kết quả trong bảng đã tham gia hay không.

+0

Không hề ... Nó sẽ không hoạt động –

0

Điều bạn đang tìm kiếm được gọi là Tham gia bên ngoài. Trong trường hợp này, bạn sẽ cần tham gia bên ngoài bên trái:

SELECT employee.id, employee.name, training.class 
FROM employee LEFT OUTER JOIN training ON employee.id = training.department_id 
WHERE training.class LIKE '%Security%' 
ORDER BY employee_id 
0

Thay vì JOIN sử dụng LEFT OUTER JOIN. Tôi cũng muốn thay đổi mệnh đề WHERE của bạn để

WHERE training.Id = 1 

nếu đó là tương đương

0
Select e.id, e.name, t.class from employee e left outer join training t on e.id = t.department_id where t.class like '%Security%' order by e.id 
Các vấn đề liên quan