2014-11-08 2 views
0

У меня есть такие таблицы.Множество постоянных соединений с графом

Title стол:

Book_Title  | ISBN |Publisher_ID 
-------------------------------------- 
Engineering BK | 1234556 | 1 
Time for a change | 1233333 | 2 
Digital Fortress | 2132312 | 3 
Davinci Code  | 2314234 | 3 
Angles and Demons | 1232323 | 3 

Книга ISBN не нормальна ISBN это из int типа.

Copy стол:

Copy_ID | ISBN 
----------------------- 
     1  | 1234556 
     2  | 1233333 
     3  | 2132312 
     4  | 2314234 
     5  | 1232323 
     6  | 1232323 

Loan стол:

Borrower_ID | Copy_ID | Date_Borrowed |Date_Returned 
------------------------------------------------------ 
    1  | 1  | 2014-10-20 | NULL 
    2  | 2  | 2014-10-18 | NULL 
    3  | 3  | 2014-10-11 | 2014-10-20 
    1  | 4  | 2011-11-11 | 2011-11-25 
    2  | 5  | 2010-10-10 | NULL 
    4  | 6  | 2012-12-12 | NULL 

Статус книг, которые еще не возвращены сохраняются как NULL.

Я хочу выбрать все заголовки, в которых все копии заимствованы и до сих пор не возвращены. Иными словами, титры, которые имеют все копии, заимствованные в таблице займов с Date_Returned как NULL.

Я пытаюсь сделать это вот так.

 SELECT DISTINCT(T.Book_Title) AS BookTitle 
    FROM Title T 
    INNER JOIN Copy CP ON T.ISBN=CP.ISBN 
    INNER JOIN Loan LN ON CP.Copy_ID=LN.Copy_ID 
    WHERE (SELECT COUNT (CP.Copy_ID) FROM Title T 
    INNER JOIN Copy CP ON T.ISBN=CP.ISBN WHERE T.Book_Title='' 
    ) 
    = 
    (SELECT COUNT (CP.Copy_ID)FROM Title T INNER JOIN Copy CP ON T.ISBN=CP.ISBN 
    INNER JOIN Loan LN ON CP.Copy_ID=LN.Copy_ID 
    WHERE LN.Date_Returned IS NULL AND T.Book_Title='') 
    GROUP BY T.Book_Title 

Но в этом я должен упомянуть названия книг по названию в каждом подзапросе. Но мне нужно проверить все заголовки в заголовках.

Как это решить? Любая помощь будет действительно велика. Заранее спасибо

ответ

1

Попробуйте это ..

SELECT a.ISBN 
FROM (SELECT ISBN,Count(Copy_ID) cnt 
     FROM Copy 
     GROUP BY ISBN) A 
     JOIN (SELECT c.isbn,Count(c.copy_id) cnt 
      FROM copy c 
        JOIN Loan L 
         ON c.copy_id = l.copy_id 
      WHERE l.Date_Returned IS NULL 
      Group by c.isbn) b 
     ON a.ISBN = B.ISBN 
      AND a.cnt = b.cnt 
     JOIN title t 
     ON t.ISBN = A.ISBN 
+0

Спасибо, что работает. Если вы не возражаете, можете добавить небольшое объяснение того, что он делает. – Sahil

0
SELECT T.Book_Title 
FROM Title T 
INNER JOIN Copy CP ON T.ISBN=CP.ISBN 
LEFT JOIN Loan LN ON CP.Copy_ID=LN.Copy_ID 
GROUP BY T.Book_Title 
HAVING sum(case when LN.Copy_ID is null then 1 else 0 end) = 0 
AND sum(case when LN.Date_Returned IS NOT NULL then 1 else 0 end) = 0 
+0

NO Это не дает какой-либо из положить, хотя у меня есть данные в моих таблицах. – Sahil

Смежные вопросы