2016-06-28 3 views
1

У меня есть три таблицы, книга (книга, название) и фильм (Movieid, название) и выписка (член, bookid, movieid).Сочетание двух несвязанных таблиц

Movie: 

id   title 
---------- ------------- 
1   Life of Brian 
2   Airplane 
3   Rush 
4   Day of the De 
5   Star Wars 
6   Thin Red Line 
7   Crouching Tig 
8   Lawrence of A 
9   Office Space 

Book: 

id   title 
---------- ---------- 
1   Life of Pi 
2   Fellowship 
3   Two Towers 
4   Dune 
5   The Hobbit 
6   1984 
7   Tom Sawyer 
8   Catcher in 
9   To Kill a 
10   Domain Dri 

Checkout: 

member_id book_id  movie_id 
---------- ---------- ---------- 
6   1 
1   3 
2   4 
1   5 
1      1 
7      2 
6      3 
8      4 
6      5 

Я хочу выбрать все книги и фильмы, которые не были извлечены.

В настоящее время я использую эти запросы.

create table MoviesNotCheckedOut (MovieID integer, MovieName text); 

    Insert Into MoviesNotCheckedOut 
    select m.id, m.title from movie m where 
    m.id NOT IN 
    (select c.member_id from checkout_item c); 

    create table BooksNotCheckedOut (BookID integer, BookName text); 

    Insert Into BooksNotCheckedOut 
    select b.id, b.title from book b where 
    b.id NOT IN 
    (select c.member_id from checkout_item c); 

create table BooksAndMoviesNotCheckedOut(BookID integer, BookName text, MovieID integer, MovieName text); 

insert into BooksAndMoviesNotCheckedOut 
select b.BookID,b.BookName,m.MovieID,m.MovieName from BooksNotCheckedOut b, MoviesNotCheckedOut m; 

Но отображая я получаю дубликаты, как это:

BookID  BookName MovieID  MovieName 
---------- ---------- ---------- ---------- 
3   Two Towers 3   Rush 
3   Two Towers 4   Day of the 
3   Two Towers 5   Star Wars 
3   Two Towers 9   Office Spa 
4   Dune  3   Rush 
4   Dune  4   Day of the 
4   Dune  5   Star Wars 
4   Dune  9   Office Spa 
5   The Hobbit 3   Rush 
5   The Hobbit 4   Day of the 
5   The Hobbit 5   Star Wars 
5   The Hobbit 9   Office Spa 
9   To Kill a 3   Rush 
9   To Kill a 4   Day of the 
9   To Kill a 5   Star Wars 
9   To Kill a 9   Office Spa 
10   Domain Dri 3   Rush 
10   Domain Dri 4   Day of the 
10   Domain Dri 5   Star Wars 
10   Domain Dri 9   Office Spa 

Как удалить дубликаты. Я хочу, чтобы отобразить его как-то вроде этого:

BookID  BookName  MovieID  MovieName 
_ _ _  _ _ _ _  _ _ _ _  _ _ _ _ _ _ 

1   xxxx   4   yyyy 
+0

Вы должны потратить некоторое время на изучение того, как работают соединения. –

+0

Dont Мне нужно отношение для объединения двух таблиц? Здесь нет никакого отношения между книгами и фильмами – leoOrion

+0

«from BooksNotCheckedOut b, MoviesNotCheckedOut m» - это соединение. –

ответ

2

Вы можете использовать union all; однако вы должны сделать это как две колонки:

select 'movie' as which, m.id, m.title 
from movie m 
where not exists (select 1 from checkout co where co.movieid = m.id) 
union all 
select 'book' as which, b.id, b.title 
from book b 
where not exists (select 1 from checkout co where co.bookid = b.id); 
+0

что означает 'select 1' mean ?? – leoOrion

+2

@leoOrion При проверке существования строки не имеет значения, выберите ли вы столбец или '*' или просто '1'. Как правило, '1' используется, чтобы показать, что вам все равно, и как оптимизация, чтобы избежать необходимости обращаться к фактической таблице, когда существование строки может уже подразумеваться из какой-либо записи индекса. –

+0

поэтому 1 может означать «любое количество столбцов, но я не забочусь» ?? – leoOrion

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