2012-03-09 4 views
2

C# 응용 프로그램을 작성 중이며 Access .mdb를 사용하고 있습니다. 전자 메일 메시지가있는 테이블과 메시지 관계가있는 테이블이 있습니다 (각 전자 메일 메시지는 여러 팀의 작업자에게 할당 될 수 있습니다).SQL : 다른 테이블에 관계가없는 데이터를 선택하십시오.

첫 번째 테이블에서 어떤 팀에도 할당되지 않은 메시지를 가져 오려고합니다. 즉, 두 번째 테이블에 항목이 없거나 빈 항목이 있습니다. 그것은 빈 항목을 사용하여 잘 작동하지만 그 할당 항목이 전혀없는 행은 반환하지 않습니다.

나는 다음과 같은 쿼리를 사용하고 있습니다 :

SELECT TOP 10 Mails.* 
FROM Mails INNER JOIN MailAssignments ON Mails.msgId = MailAssignments.msgId 
    WHERE (Mails.msgId <= ?) 
    AND 
    (Mails.msgId NOT IN (SELECT msgId FROM MailAssignments)) 
    OR (MailAssignments.forTeam IS NULL) 
    OR (MailAssignments.forTeam = '') 

업데이트 :이 때문에 일부 조건에 쿼리는 행이의 관계를 가진 반환해야 가입의 어떤 종류를 사용할 필요가

다른 테이블 (예 : 팀원의 메시지 및 할당되지 않은 메시지를 표시하려는 경우).

는 UPDATE :

OK, 나는 빈 할당, 존재하지 않는 유일한 사람을 확인할 필요가 없도록 내가 두 번째 테이블에서 모든 할당을 삭제하여 더 간단 그것을 만들 수 있습니다 추측 조금도. 하지만 할당되지 않은 데이터와 함께 할당 된 데이터를 때때로 표시해야하는 경우도 있습니다. 그리고 난 단지 다른 매개 변수를 가질 것있는 하나 개의 쿼리를 작성하도록 변경해야합니다/

UPDATE/솔루션 :

내가 좀 더 조정을했지만 왼쪽은 기본적으로 나를 위해 속임수를 썼는지에 가입하세요! 그 힌트와 모든 도움에 감사드립니다, 얘들 아!

+0

업데이트 : 당신은 정말 메일에 대한 자신의 팀에서 메시지를 가질 수 없습니다 팀에 배정되지 않은 것입니까? –

+0

근로자가 기본적으로 팀의 메시지를 보길 원하지만 다른보기를 활성화하면 할당되지 않은 메시지도 볼 수 있습니다 (예 : 팀에 할당 할 수 있음) – Val

+0

좀 더 조정했지만 LEFT JOIN은 기본적으로 나를 위해 속임수! 도와 줘서 고마워! – Val

답변

4

이 충분해야한다 : 당신이 Mails 관련이 있지만 팀이 정말 할당 할 수 없습니다 것을 MailAssignments의 행이있을 수 있습니다 그쪽

SELECT TOP 10 Mails.* 
FROM Mails 
    WHERE (Mails.msgId <= ?) 
    AND 
    (Mails.msgId NOT IN (SELECT msgId FROM MailAssignments)) 

당신의 설명을 읽고, 그것은 보인다합니다 (forTeam 열이있는 빈 문자열입니다. 좋은 디자인이 아니지만이 경우에는 다음을 사용하십시오.

SELECT TOP 10 Mails.* 
FROM Mails 
    LEFT JOIN 
    MailAssignments ON Mails.msgId = MailAssignments.msgId 
WHERE (Mails.msgId <= ?) 
    AND ( (MailAssignments.forTeam IS NULL) 
     OR (MailAssignments.forTeam = '') 
    ) 
+0

Access에서 일치를 반환하기 때문에 10 개가 넘는 레코드가 반환 될 수 있음을주의하십시오. Order By 문에 고유 한 열 (필드)을 포함시켜이 문제를 해결할 수 있습니다. – Fionnuala

+0

괜찮습니다. 가장 중요한 것은 다른 조건이 올바르게 작동한다는 것입니다 (JOIN 키워드 포함) – Val

1

두 번째 테이블의 열이 필요합니다. INNER JOIN 대신 OUTER JOIN을 사용하십시오 (조인에서 일치하지 않는 테이블의 항목을 반환 함).

필요없는 경우 @ypercube에 동의합니다.

2

기존 과제와 메일을 (forTeam <> '')와 일치하는 것을 시도와 일치하는 자리를 차지하지 않았다 곳에 사람들을 따기 MailAssignments의 부분 집합에 Mails 가입 :

SELECT TOP 10 
    Mails.* 
FROM Mails 
    LEFT JOIN MailAssignments ON Mails.msgId = MailAssignments.msgId 
    AND MailAssignments.forTeam <> '' 
WHERE Mails.msgId <= ? 
    AND MailAssignments.msgId IS NULL /* either no match for this mail at all 
             or no match with an existing assignment 
             – so, just no match */ 
+0

'MailAssignments.forTeam <> '''이 (가)이 방법으로 취소 되었습니까? 아닙니다. –

+0

@ypercube : 예, 쿼리는'Mails' 행에'MailAssignments'가 전혀 일치하지 않는 행을 반환하거나 일치하는 행에 빈'forTeam' 값 ('' '또는'NULL'). –

+0

@ypercube : 정확히 무엇이 반환되어야 하는지를 지정하는 것을 잊어 버렸습니다. :) 지금 대답을 업데이트했습니다. –

관련 문제