it-swarm.com.de

SQL-Abfrage zum Abgleichen mehrerer Werte in derselben Spalte

Ich habe eine Tabelle in MySQL wie folgt.

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

Ich brauche die Mitarbeiter, die als Soft.Egr und Sr.Soft.Egr und Pro.Mgr gearbeitet haben. Es ist nicht möglich, IN oder mehrere ANDs in der Abfrage zu verwenden. Wie macht man das?? 

13
prasanth

Was Sie tatsächlich suchen, ist relational division , auch wenn Ihre Übungsanforderungen die Verwendung von AND (aus welchem ​​Grund auch immer?) Verbieten. Dies ist schwierig, kann aber in SQL korrekt ausgedrückt werden.

Relational Division in prosa bedeutet: Finden Sie die Mitarbeiter, die in der Tabelle "Employees" einen Datensatz für alle vorhandenen Bezeichnungen haben. Oder in 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
    )
)

Um die obige Abfrage in Aktion zu sehen, betrachten Sie diese SQLFiddle

Eine gute Ressource zur Erklärung der relationalen Unterteilung finden Sie hier: http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational- Einteilung

6
Lukas Eder

Einweg:

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

Wenn Sie weitere Informationen zu den einzelnen Rollen benötigen (z. B. Datumsangaben), können Sie für jede der zusätzlichen Bezeichnungen wieder eine Verbindung zu Ihrer ursprünglichen Tabelle herstellen.

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';
3
ninesided

Warum nicht das folgende (für 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'

Link zu SQLfiddle

Ich weiß, dass dies möglicherweise nicht optimiert ist, aber ich finde, dass dies viel einfacher zu verstehen und zu ändern ist.

1
Sida Zhou
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
    )
)
0
jaz

Versuchen Sie diese Abfrage:

SELECT DISTINCT t1.employee, 
                t1.designation 
FROM tempEmployees t1, tempEmployees t2, tempEmployees t3 
WHERE t1.employee = t2.employee AND
      t2.employee = t3.employee AND 
      t3.employee = t1.employee AND
      t1.designation != t2.designation AND 
      t2.designation != t3.designation AND 
      t3.designation != t1.designation
0
Nageswar Rao