书籍的多个副本,只显示那些不可用的_ SQL

时间:2013-04-22 02:28:05

标签: tsql sql-server-2012

好的,所以我有一个图书馆风格的数据库,我想抓住所有售罄的书籍的名称。如果所有副本都已出租,该书被认为已售罄。我到目前为止的查询是:

SELECT Book.Title, Physical_book.book_available AS Available
FROM Book
JOIN Physical_book ON Book.book_id = Physical_Book.book_id
WHERE Physical_book.book_available = 'n';

我的Physical_Media表具有属性book_available,该属性告诉您该书是否可以使用N或Y.如果有多个副本,则会在此表中重复书籍。这意味着,如果这本书是Title One,那么Title One所有同时具有相同Book_ID 2的所有人都有三个二等分。这三本书中有2本标有n,另一本标有y。从技术上和我想要的是,这个查询只能拉出那些已售罄的书。由于它返回Title ONe的结果,因此显然无法正常工作。有什么想法吗?

表格的例子

/* Physical_Book Table */
INSERT INTO Physical_Book (Physical_ID, Book_ID, Book_available)
VALUES (1,1,'y');
INSERT INTO Physical_Book (Physical_ID, Book_ID, Book_available)
VALUES (2,1,'n');
INSERT INTO Physical_Book (Physical_ID, Book_ID, Book_available)
VALUES (3,1,'n');

/*Book Table*/
INSERT INTO Book (Book_ID, author_id, genre_id, title, copyright)
VALUES (1, Tammy, Horror, Book One, 1999)

使用JW查询

SELECT Book.Title, Physical_book.book_available AS Available
FROM Book
JOIN Physical_book ON Book.book_id = Physical_Book.book_id
Group BY Book.title, Physical_book.book_available
HAVING COUNT (*) = COUNT (CASE WHEN book_available = 'n' THEN 1 END);

2 个答案:

答案 0 :(得分:2)

SELECT  ID, title
FROM    Physical_Book
GROUP   BY ID, title
HAVING  COUNT(*) = COUNT(CASE WHEN book_available = 'n' THEN 1 END)

假设您有此记录,

╔════╦═══════════╦════════════════╗
║ ID ║   TITLE   ║ BOOK_AVAILABLE ║
╠════╬═══════════╬════════════════╣
║  1 ║ Title One ║ y              ║
║  1 ║ Title One ║ n              ║
║  1 ║ Title One ║ n              ║
║  2 ║ Title Two ║ n              ║
║  2 ║ Title Two ║ n              ║
╚════╩═══════════╩════════════════╝

查询的预期输出是

╔════╦═══════════╗
║ ID ║   TITLE   ║
╠════╬═══════════╣
║  2 ║ Title Two ║
╚════╩═══════════╝

答案 1 :(得分:0)

这样的事情应该有效。

select title
from book
where not exists
(select title
from book
where available = 'Y'
)