2013-06-14 4 views
1

클라이언트 및 축제가있는 테이블이 있습니다. 모든 축제는 매년 (새해처럼) 발생합니다. 그러나 모든 클라이언트가 어떤 축제에도 초대되지는 않습니다.다중 SQL 테이블 선택

지금은 festival1에 초대 된 여성 고객을 확보해야하지만 festival2에는 초대받지 않았습니다.

Table "clients" 
+-----+--------------+-----------+---------+-----+ 
| id | name   | email  | adress | sex | 
+-----+--------------+-----------+---------+-----+ 
| 1 | Ivan   | [email protected] | NY city | m | 
| 2 | Michael  | [email protected] | LA  | m | 
| 3 | Anna   | [email protected] | LA  | w | 
| ... 
+-----+--------------+-----------+---------+-----+ 

Table festivals 
+-----+------------+-------+ 
| id | name  | date | 
+-----+------------+-------+ 
| 1 | festival1 | 8-03 | 
| 2 | festival2 | 23-02 | 
| 3 | festival3 | 1-01 | 
| ... 
+-----+------------+-------+ 

Talbe "invitations" 
+--------+----------+------+ 
| client | festival | year | 
+--------+----------+------+ 
| 1  | 2  | 2013 | 
| 3  | 1  | 2009 | 
| ... 
+--------+----------+ 

나는이 쿼리처럼 뭔가를 시작하지만 수정해야 :

SELECT name 
    FROM clients, festivals, invitations 
    WHERE clients.sex = w 
     AND festivals.name = festival1 
     AND clients.id = invitations.client 
     AND invitations.year = 2013 
+0

당신에 대해 더 구체적으로 할 수있는 작업 귀하의 질문에 잘못 되었습니까? 당신은 무엇을 기대하고 있었는지 그리고 무엇을 얻었습니까? –

+0

관련이 없지만 사용중인 조인 구문이 잘못되지는 않았지만 20 년이 넘었으며 ANSI 92에서 명시 적 조인으로 바뀌 었습니다. Aaron Bertrand는 새로운 조인 구문으로 전환하기 위해 내가 할 수있는 것보다 훨씬 나은 경우를 만들었습니다. http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old -style-joins.aspx – GarethD

답변

1

을 festival2 초대 :

SELECT * 
FROM Clients 
     INNER JOIN Invitations 
      ON Invitations.Client = Clients.ID 
     INNER JOIN Festivals 
      ON Festivals.ID = Invitations.Festival 
WHERE Festivals.Name = 'Festival1' 
AND  Clients.Sex = 'W' 
AND  Invitations.Year = 2013 
AND  NOT EXISTS 
     ( SELECT 1 
      FROM Invitations i2 
        INNER JOIN Festivals f2 
         ON f2.ID = i2.Festival 
      WHERE i2.Client = Clients.ID 
      AND  f2.Name = 'Festival2' 
      AND  i2.Year = Invitations.Year 
     ); 

Example on SQL Fiddle

1
SELECT c.name 
FROM clients c 
INNER JOIN invitations i ON c.id = i.client 
INNER JOIN festivals f ON f.id = i.festival 
WHERE c.sex = 'w' 
AND i.year = 2013 
group by c.name 
having sum(case when f.name='festival1' then 1 else 0 end) > 0 
and sum(case when f.name='festival2' then 1 else 0 end) = 0 
1

내가 이런 짓을 할 것이다 :

SELECT c.Name 
    FROM clients c 
    INNER JOIN invitations i 
     ON i.client = c.id 
     AND i.year = 2013 
    INNER JOIN festivals f 
     ON i.festival = f.id 
     AND f.name = 'festival1' 
WHERE 
    c.sex = 'w' 
+0

답변 해 주셔서 감사합니다. 그러나이 쿼리는 festival2에 초청되거나 초대되지 않은 여성도 데려 갈 것입니다 2. 나는 축제 2에 초청되지 않은 것이 필요합니다 .2 – sirjay

0

먼저 당신이 필요로하는 다음을 통해 고객과 축제에 참여 : 고객/초대장/초청장/축제

당신이 고객을 폐기 할 필요가

둘째 당신은 당신의 쿼리의 결과를 제거하기 위해 NOT EXISTS을 사용할 수 있습니다

SELECT name 
    FROM clients, festivals, invitations 
    WHERE clients.sex = w 
     AND festivals.name = festival1 
     AND festivals.name != festival2 
     AND clients.id = invitations.client 
     AND festivals.id = invitations.festival 
     AND invitations.year = 2013