2013-05-24 13 views
11

私は以下のようにMySQLにテーブルを持っています。同じ列の複数の値を照合するためのSQL照会

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 

Soft.EgrとSr.Soft.EgrとPro.Mgrとして働いていた従業員を取得する必要があります。クエリでINまたは複数のANDを使用することはできません。これを行う方法??

+0

あなたは望む結果を得るために 'self join'を使う必要があります。 http://www.tutorialspot.com/sql/sql-self-joins.htm – Meherzad

答えて

6

あなたが実際に探しているかもしれないと、あなたの運動の要件がAND使用禁止しても、relational divisionです(何らかの理由で?)。これは難解ですが、SQLで正しく表現することは可能です。

プロセスの関係部は、すべての既存の指定の従業員表のレコードを持つ従業員を検索します。または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 
    ) 
) 

アクションで上記のクエリを表示するには、このSQLFiddle

検討し、関係部門を説明する優れたリソースは、ここで見つけることができます: http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division

+0

を参照してください。これらはすべて可能な指定であることがわかりませんが、これは例のものですが、興味深い解決策です。 – ninesided

+1

@ninesided:わかった、あなたはおそらく正しいだろう。しかし、私は(これは学問的な質問であるので)腸の感覚を持っています。そうでない場合は、スタックオーバーフローに関するリレーショナル部門の意識を高めることはまだ良いです:-) –

19

一つの方法:あなたが戻って(日付など)の各役割についての追加情報を取得する必要がある場合は

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

、追加の指定ごとにあなたの元のテーブルに戻って参加することは可能なソリューションです。

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

なぜ、以下の(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' 

リンクSQLfiddle

に私はこれが最適化されないかもしれませんけど、私は、これははるかに容易に理解し、修正するために見つけます。

関連する問題