2013-06-28 9 views
5

mit:einen Fehler bekommen, wenn Joins Ich habe diese Abfrage in Abfrage

SELECT * FROM `employee_activities` a 
LEFT JOIN `activity` b ON a.activity_code = b.code 
LEFT JOIN `employees` c ON a.employee_code = c.code 
WHERE b.type = "Design" 
AND c.code NOT IN(
    SELECT * FROM `employee_activities` a 
     LEFT JOIN `activity` b ON a.activity_code = b.code 
     LEFT JOIN `employees` c ON a.employee_code = c.code 
     WHERE b.type = "Testing" 
) 
GROUP BY c.code 

ich diesen Fehler:

#1241 - Operand should contain 1 column(s) 

ich binden alle Mitarbeiter zu erhalten, die mindestens eine Aktivität haben, Geben Sie "Design" und keine Aktivität vom Typ "Testing" ein.

Ich habe eine Abfrage, die funktioniert, aber ich möchte, dass es mit Joins funktioniert.

Dies funktioniert:

SELECT c.name FROM `employee_activities` a, `activity` b, `employees` c 
WHERE a.activity_code = b.code 
AND a.employee_code = c.code 
AND b.type = "Design" 

AND c.code NOT IN(
    SELECT c.code FROM `employee_activities` a, `activity` b, `employees` c 
     WHERE a.activity_code = b.code 
     AND a.employee_code = c.code 
     AND b.type = "Testing" 
) 
GROUP BY c.code 

Was habe ich auf dem SQL falsch machen mit beitritt?

+2

Sie können 'SELECT *' in der Unterabfrage nicht so tun; Der Abschnitt "c.code NOT IN" sucht nach einer einzelnen zurückzugebenden Komponente. – LittleBobbyTables

+0

Danke. Danke euch allen. :) –

+0

Es klingt wie dies gelöst ist, aber wenn Sie immer noch in Betracht ziehen, Ihre Frage mit einem SQLFiddle zu aktualisieren. – Strawberry

Antwort

7

Für die nicht in Sub-Abfrage - sollte es nur eine Spalte enthalten - zum Beispiel

SELECT * FROM `employee_activities` a 
LEFT JOIN `activity` b ON a.activity_code = b.code 
LEFT JOIN `employees` c ON a.employee_code = c.code 
WHERE b.type = "Design" 
AND c.code NOT IN(
    SELECT b.employee_code FROM `employee_activities` a 
     LEFT JOIN `activity` b ON a.activity_code = b.code 
     LEFT JOIN `employees` c ON a.employee_code = c.code 
     WHERE b.type = "Testing" 
) 
GROUP BY c.code 
+0

ooops. Ja, mein Schlechter. Hab das nicht gesehen. Vielen Dank. –

2

Ihr Problem in diesem Teil ist:

AND c.code NOT IN(
SELECT * FROM 

Sie keine * hier haben kann Es prüft, ob c.code in der Liste der zurückgegebenen Feldwerte enthalten ist, und muss nur ein einzelnes Feld in der Auswahl angeben.

2

Das Problem ist in diesem Abschnitt:

AND c.code NOT IN( 
    SELECT * FROM `employee_activities` a 

Sie können nicht SELECT * in dieser verschachtelten Abfrage. Sie müssen genau eine Spalte auswählen, die mit der c.code verglichen wird. Sie müssen dies statt:

AND c.code NOT IN( 
    SELECT c.code FROM `employee_activities` a 
3

Ihre Anfrage

AND c.code NOT IN(
    SELECT * FROM `employee_activities` a 
... 

versucht c.code zu alle Spalten in der Unterabfrage zu vergleichen. Was du willst, ist wahrscheinlich;

AND c.code NOT IN(
    SELECT c.code FROM `employee_activities` a 

Auch haben Sie ein Problem in Ihrem LEFT JOIN;

LEFT JOIN `activity` b ON a.activity_code = b.code 
... 
WHERE b.type = "Design" 

Wenn Sie eine Spalte zu vergleichen, die in in einer WHERE Klausel verbunden bleibt, es ist im Grunde das ganze dann auch kommen in eine INNER JOIN. Da Ihre ursprüngliche Abfrage einen inneren Join zu verwenden scheint, sollte das in Ordnung sein, aber Sie können es auch ändern;

SELECT * FROM `employee_activities` a 
JOIN `activity` b ON a.activity_code = b.code AND b.type='Design' 
LEFT JOIN `employees` c ON a.employee_code = c.code 
2

tun:

SELECT * FROM `employee_activities` a 
LEFT JOIN `activity` b ON a.activity_code = b.code 
LEFT JOIN `employees` c ON a.employee_code = c.code 
WHERE b.type = "Design" 
AND c.code NOT IN(
    SELECT c.code FROM `employee_activities` a 
     LEFT JOIN `activity` b ON a.activity_code = b.code 
     LEFT JOIN `employees` c ON a.employee_code = c.code 
     WHERE b.type = "Testing" 
) 
GROUP BY c.code 

Wie hier sollten Sie die Daten mit dem Code-Spalte und vergleichen * werden alle Datensätze abzurufen.

Verwandte Themen