2013-05-24 35 views
11

Tôi có một bảng trong MySQL như sau.Truy vấn SQL để khớp nhiều giá trị trong cùng một cột

Id Designation   Years   Employee 
1 Soft.Egr   2000-2005   A 
2 Soft.Egr   2000-2005   B 
3 Soft.Egr   2000-2005   C 
4 Sr.Soft.Egr   2005-2010   A 
5 Sr.Soft.Egr   2005-2010   B 
6 Pro.Mgr    2010-2012   A 

Tôi cần có nhân viên làm việc như Soft.Egr và Sr.Soft.Egr và Pro.Mgr. Không thể sử dụng IN hoặc nhiều AND trong truy vấn. Làm như thế nào??

+0

Bạn phải sử dụng 'tự kết nối' để có được kết quả mong muốn. Tham khảo http://www.tutorialspoint.com/sql/sql-self-joins.htm – Meherzad

Trả lời

6

gì bạn thực sự có thể tìm kiếm là relational division, ngay cả khi yêu cầu tập thể dục của bạn cấm sử dụng AND (vì lý do gì?). Điều này là khó khăn, nhưng có thể thể hiện chính xác trong SQL.

Phân chia quan hệ trong prosa có nghĩa là: Tìm những nhân viên có hồ sơ trong bảng nhân viên cho tất cả các chỉ định hiện có. Hoặc trong SQL:

SELECT DISTINCT E1.Employee FROM Employees E1 
WHERE NOT EXISTS (
    SELECT 1 FROM Employees E2 
    WHERE NOT EXISTS (
     SELECT 1 FROM Employees E3 
     WHERE E3.Employee = E1.Employee 
     AND E3.Designation = E2.Designation 
    ) 
) 

Để xem các truy vấn trên trong hành động, xem xét việc này SQLFiddle

Một nguồn lực tốt giải thích bộ phận quan hệ có thể được tìm thấy ở đây: http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division

+0

chúng tôi không biết chắc chắn rằng đây là tất cả các chỉ định có thể, đây chỉ là những cái trong ví dụ - giải pháp thú vị dù sao đi nữa! – ninesided

+1

@ notinesed: Tôi biết, bạn có thể đúng. Nhưng tôi có một cảm giác ruột (vì đây là một câu hỏi học thuật), rằng điều này có thể là về sự phân chia quan hệ. Và nếu nó không, nó vẫn còn tốt để nâng cao nhận thức bộ phận quan hệ trên Stack tràn :-) –

19

Một cách:

select Employee 
from job_history 
where Designation in ('Soft.Egr','Sr.Soft.Egr','Pro.Mgr') 
group by Employee 
having count(distinct Designation) = 3 
3

Nếu bạn cần phải nhận được thêm thông tin về về mỗi vai trò (như ngày) sau đó gia nhập trở lại bảng ban đầu của bạn cho mỗi người trong số các chỉ định thêm là một giải pháp khả thi:

SELECT t.Employee, t.Designation, t.Years, t1.Designation, t1.Years, t2.Designation, t2.Years 
FROM Table t 
INNER JOIN t2 ON (t2.Employee = t.Employee AND t2.Designation = 'Sr.Soft.Egr') 
INNER JOIN t3 ON (t3.Employee = t.Employee AND t3.Designation = 'Soft.Egr') 
WHERE t.Designation = 'Pro.Mgr'; 
1

Tại sao không phải là sau (đối với postgresql)?

SELECT employee FROM Employees WHERE Designation ='Sr.Soft.Egr' 
INTERSECT 
SELECT employee FROM Employees WHERE Designation ='Soft.Egr' 
INTERSECT 
SELECT employee FROM Employees WHERE Designation ='Pro.Mgr' 

Liên kết đến SQLfiddle

Tôi biết điều này có thể không được tối ưu hóa, nhưng tôi tìm thấy điều này nhiều dễ dàng hơn để hiểu và sửa đổi.

Các vấn đề liên quan