2015-01-12 6 views
1

내가이 SQL의 문제에 붙어 : 나는 여기에 2014 년에 대한 연간 비용을 지불하지 않은 모든 구성원을 찾을 필요는 데이터베이스의 샘플입니다이 특정 SQL 쿼리를 해결하는 방법은 무엇입니까?

Table 'members' 

| ID | name | 
--------------- 
| 1 | Franck | 
| 2 | Andy | 
| 3 | Jack | 


Table 'payements' 

| ID | memberID | year | amount | 
------------------------------------ 
| 1 | 1  | 2013 | 100 | 
| 2 | 1  | 2014 | 100 | 
| 3 | 2  | 2013 | 100 | 

그리고 나는 이런 식으로 뭔가를 시도 :

SELECT members.name FROM members 
LEFT JOIN payements ON (payements.memberID = members.ID) 
WHERE (payements.year = 2014 AND payements.amount < 100) OR payements.memberID IS NULL 

내 쿼리는 Jack (아무도 지불하지 않은 사람)을 올바르게 찾았지만 다른 연도의 항목이 있기 때문에 Andy를 찾지 못합니다. 2014 년 특정 항목이없는 모든 회원 (또는 100 개 이하의 항목)을 어떻게 요청할 수 있습니까?

+2

. '<= 100'을 의미하지 않습니까? – Mihai

답변

2

세트

  1. 설정
  2. 설정을 납입 제대로

우리가 함께 같은 세트에 가입되어 이명을 지불해야 한 모두의 측면에서이 데이터를 고려 나머지에서 2014 년에 지불 한 사람들을 제외하고는 왼쪽 결합, 우리는 현재 연도의 지불 만 표시되도록 결합에 제한을 추가합니다. 절은 외부을 한 곳은 내부 조인에 참여하기 때문에 우리는 다음

Select m.name, p.memberid, p.year, p.amount 
from members m 
LEFT JOIN payements p 
on m.id = p.memberId 
and (p.year = 2014 and p.amount >= 100) 
WHERE p.year is null 

당신의하지 작업을했던 이유였다 .. 사용자의 전체 세트에서 사람들을 제외합니다. 그리고 지불하지 않은 사용자를 원했기 때문입니다. 지불 한 세트가 아닙니다. 그래서 우리는 두 번째 세트를 돈을 지불 한 사람들로 설정해야했습니다 ... <을> =로 변경하십시오.

+0

앤디가 프랭크에있다. [링크] (http://sqlfiddle.com/#!2/2ff3b/5) (그 이유를 이해하지 ...) –

+0

내가 생각했던 것보다 조금 더 까다 롭습니다. http://sqlfiddle.com/#!2/2ff3b/20/0 우리는 1 세트를 모두 두 번째로 설정한다는 측면에서 이것을 생각할 필요가있었습니다. 지불 한 사람들. 우리는이 두 세트에 합류 할 필요가 있었지만 두 번째 세트가 아닌 두 번째 세트에만 보관해야했습니다. – xQbert

0
SELECT * FROM members WHERE ID NOT IN(SELECT memberID FROM payments WHERE year='2014') 
+0

하위 쿼리는'select memberId .... '이어야합니다. –

+0

이 내 흥분을 호소했습니다 - 죄송합니다. – terary

+1

실수가 있으면이 게시물을 올바르게 편집하십시오. – Edward

1

WHERE에서 하위 쿼리를 사용하는 또 다른 방법입니다.

하위 쿼리에서 연회비를 지불 한 모든 회원을 찾습니다. 따라서 외부 쿼리에서 하위 쿼리에없는 멤버 만 유지하면 원하는 멤버가됩니다. BTW

SELECT name 
FROM members 
WHERE ID NOT IN (SELECT memberID 
       FROM payements 
       WHERE year = 2014 AND amount < 100) 

, 당신은 amount <= 100을 의미합니까 ...

편집 : 2014 년 자신의 비용을 지불 회원 가, 양, 그래서 여기에 크거나 100보다 같아야은 수정입니다 버전 :

:

SELECT name 
FROM members 
WHERE ID NOT IN (SELECT memberID 
       FROM payements 
       WHERE year = 2014 AND amount >= 100) 

추가 된 새 멤버 만 2014 년에 80의 금액을 지불 한 테스트에서 "에이미", 그녀는 앤디와 잭 함께 나열됩니다 6,

Andy 

Jack 

Amy 

SQL FIDDLE

는 ON,`ON ㅋ AND..` 그러나 때문에`<100`의 ANDY를 찾을 수 없습니다하는 곳에서 조건을 이동
+0

아니요. 저는 100 세 이하를 의미했습니다. 프랭크 씨 (비용을 지불 한 사람)가 결과에 포함되는 것을 원하지 않습니다. –

+0

@maximeschoeni 나는 내 솔루션을 바꿨다. 이제 나는 당신이 원하는 것이라고 생각한다. 나는이 경우에 보완 (당신이 원하지 않는 사람들)을 얻고 그것을 빼는 것이 더 쉽다고 생각한다. – JosEduSol

관련 문제