2014-11-15 5 views
0

나는 두 권의 데이터베이스를 가지고있다. 하나는 책 레코드를 보관하고 하나는 대출 레코드를 보관하는 데이터베이스이다.MS Access 어디서 작동하지 않는가

아래의 SQL은 제대로 작동하지 않습니다. 책이 반환 된 곳의 결과를 제공하지만 대출에 포함되지 않은 책은 반환하지 않습니다.

SELECT Book.BookID, Book.ISBN, Book.Title, Book.AuthorID, Book.SubjectID, Loans.[Returned?] 
FROM Book INNER JOIN Loans ON Book.BookID = Loans.BookID 
WHERE ((Book.BookID) Not In (SELECT DISTINCT BookID FROM [Loans] WHERE BookID IS NOT NULL)) OR (((Loans.[Returned?])=True)) 
ORDER BY Book.Title; 

내가 잘못 했습니까?

편집 : 내가 원하는 보고서를 얻기 위해 현재 사용 가능한 책을 수집하도록 쿼리를 원합니다. 사용 가능한 서적에는 반환 된 서적과 빌려 오지 않은 서적이 포함됩니다.

+0

당신이 원하는 것을 설명하면 도움이 될 것입니다. 샘플 데이터와 원하는 결과가 항상 도움이됩니다. –

+0

BookID 열에 대한 내부 조인이 있지만 한 테이블에서 null 인 책만 반환하도록 요청하고 있습니까? – Ilion

답변

0

제가 이해한다면, 대출 도서에없는 모든 도서 및 대출 대출 도서에 반환 된 것으로 표시된 도서를 원할 것입니다. 이것을 시도하십시오 :

SELECT 
    Book.BookID, 
    Book.ISBN, 
    Book.Title, 
    Book.AuthorID, 
    Book.SubjectID, 
    Loans.[Returned?] 
FROM Book 
LEFT JOIN Loans ON Book.BookID = Loans.BookID 
WHERE 
    (((Loans.BookID) is NULL)) 
OR 
    (((Loans.[Returned?])=True)) 
ORDER BY Book.Title; 
+1

고마워요! 나는 당신에게 투표 할 수 있었으면 좋겠다. 그러나 15over를 얻을 때까지 나는 상대적으로 stackoverflow에 새로운 것을 할 수 없다. –

0

간단한 왼쪽 결합이 필요한 것 같습니다. 가능한 모든 책의 마스터 "Book"테이블에서 시작하여 하위 쿼리에 LEFT JOIN을 수행하십시오. 부질의는 책으로, 얼마나 많은 사람들이 아직도 탁월한 지 (즉, 반환되지 않은)지를 얻는다. 반환 된 경우 다시 대출 할 수 있습니다. 아직 밖으로 나올 경우 최대 개수()가 1로 설정됩니다. /에 의한 그룹은 해당 도서를 계속 대출 상태로 유지합니다.

따라서 책 ID와 일치하는 왼쪽 결합을 수행하면 StillLoanedOut.BookID IS NULL을 통해 StillLoanedOut 하위 쿼리에 남아있는 레코드가없는 마스터 책 목록의 레코드 만 가져옵니다. 나는 당신의 대부 테이블이 어떻게 구성되어 있는지 알 수 없기 때문에

SELECT 
     B.BookID, 
     B.ISBN, 
     B.Title, 
     B.AuthorID, 
     B.SubjectID 
    FROM 
     Book B 
     LEFT JOIN 
     (select L.BookID 
      from Loans L 
      group by L.BookID 
      having MAX(case when L.Returned then 0 else 1 end) = 1) as StillLoanedOut 
     ON B.BookID = StillLoanedOut.BookID 
    WHERE 
     StillLoanedOut.BookID IS NULL 
    ORDER BY 
     B.Title; 

는,이 방법은 특정 도서의 대출 기록을 보여주는 여러 레코드가있는 경우에 작동합니다. max()를 사용하면 책을 8 번 대출하면 최대 (1) (가장 최근) 시간 만 반환됩니다 ... 이전 7 인스턴스가 다시 대출되어야합니다.