2013-06-28 28 views
5

mam tej kwerendy:otrzymuję błąd przy użyciu łączy w zapytaniu

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 

otrzymuję ten błąd:

#1241 - Operand should contain 1 column(s) 

jestem wiązana uzyskać wszystkich pracowników, które mają co najmniej jedną aktywność wpisz "Design" i Brak działania typu "Testowanie".

Mam zapytanie, które działa, ale chciałbym, aby działało z łączeniami.

to działa:

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 

Co zrobiłem źle na sql z łączy?

+2

Nie można wykonać "SELECT *" w podzapytaniu w ten sposób; część 'c.code NOT IN' szuka pojedynczego cloumna do zwrócenia. – LittleBobbyTables

+0

Dziękuję. Dziękuję wam wszystkim. :) –

+0

Wygląda na to, że zostało to rozwiązane, ale jeśli nadal rozważasz aktualizację pytania za pomocą sqlfiddle. – Strawberry

Odpowiedz

7

Albowiem nie w zapytaniu sub - powinien on zawierać tylko jedną kolumnę - na przykład

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. tak, moje złe. Nie widziałem tego. Dzięki. –

2

Twój problem jest w tej części:

AND c.code NOT IN(
SELECT * FROM 

Nie można mieć tutaj * jego szukanie, czy c.code znajduje się na liście zwróconych wartości pól i musi określić tylko jedno pole w selekcji.

2

Problem jest w tym dziale:

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

Nie możesz SELECT * w tym zagnieżdżone zapytania. Musisz wybrać dokładnie jedną kolumnę, która będzie porównywana z c.code. Musisz to zamiast:

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

Zapytanie

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

próbuje porównać c.code do wszystkie kolumny w podzapytaniu. To, czego chcesz, to prawdopodobnie;

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

Masz również problem ze swoim LEFT JOIN;

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

Jeśli porównać kolumnę, która pozostaje dołączył do WHERE klauzuli, to w zasadzie włącza całość łączą się z INNER JOIN. Ponieważ pierwotne zapytanie wydaje się używać wewnętrznego sprzężenia, powinno być w porządku, ale równie dobrze możesz je zmienić;

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

to zrobić:

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 

Jak tu należy porównać dane z kolumny i kod * pobiera wszystkie rekordy.

Powiązane problemy