LINUX.ORG.RU

[mysql]Хитрая выборка из 2-х таблиц

 


0

0

Есть две таблицы. К примеру список всех книг (IDкниги, название книги) и список книг на полке (IDполки, IDкниги). Нужно выбрать все ID всех книг, которые не находятся на некоторой полке.

Уже несколько дней голову ломаю - ничего не могу придумать.

★★★★★
Ответ на: комментарий от provaton

Только ты показал, как выборать те книги, которые ЕСТЬ на полке, а мне необходимо выбрать те, которых НЕТ на полке.

trex6 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Тьфу, неправильно задание прочёл.

...

SELECT * FROM books LEFT JOIN shelf ON (books.shelf_id = shelf.id AND shelf.id <> NNN) WHERE shelf.id IS NULL;

где-то так.

KRoN73 ★★★★★
()
Ответ на: комментарий от trex6

Ну, если предположить что каждая книга лежит ровно на одной полке, тогда так:

select k.id from kniga k, polka p where p.id<>1 and p.kniga_id=k.id;

provaton ★★★★★
()
Ответ на: комментарий от KRoN73

>SELECT * FROM books LEFT JOIN shelf ON (books.shelf_id = shelf.id AND shelf.id <> NNN) WHERE shelf.id IS NULL;

Это мне отлично помогло!
Большое спасибо.

trex6 ★★★★★
() автор топика
Ответ на: комментарий от trex6

Что-то я поторопился.
Вобщем если делать так:
SELECT * FROM books LEFT JOIN shelf ON (books.shelf_id = shelf.id) WHERE shelf.id IS NULL;

То выбираются те книги, которые не стоят ни на одной полке.
Но книга может стоять на нескольких полках (пусть это не совсем полки, а, например, каталоги или что-то типа того). А если попробовать
SELECT * FROM books LEFT JOIN shelf ON (books.shelf_id = shelf.id) WHERE shelf.id <> NNN;
То выбираются все книги, и у всех shelf.id есть NULL

trex6 ★★★★★
() автор топика

Менеее эффективные, чем minus, варианты в Оракле

с exists

select id from knigi where not exists (select * from polki where kniga_id = knigi.id)

с in

select id from knigi where id not in (select kniga_id from polki)

anonumus
()
Ответ на: комментарий от anonumus

Ещё одно подверждение того, что дополнительные фичи оракла позволяют писать с его помощью более-менее сложные приложения даже полным нубам.

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

> позволяют писать с его помощью более-менее сложные приложения даже полным нубам.

Причём даже это они умудряются делать неправильно.

r_asian ★☆☆
()
Ответ на: комментарий от anonumus

Связвание таблиц изучай, лапоть, твои запросы без минус положат вверх лапками любое железо.

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

>Ещё одно подверждение того, что дополнительные фичи оракла позволяют писать с его помощью более-менее сложные приложения даже полным нубам.

>Причём даже это они умудряются делать неправильно.


Можно список "фичей" оракла, которые используются в моих запросах?
И что именно неправильного в моих запросах?

anonumus
()

select id_kniga, name_kniga from kniga where id_kniga not in (select id_kniga from polka);

select id_kniga, name_kniga from kniga where id_kniga <> all (select p.id_kniga from polka p);

dimon555 ★★★★★
()

select tempk.kniga_id from (select k.kniga_id, s.shelf_id from knigi k left outer join shelf s on k.kniga_id = s.kniga_id) tempk where tempk.shelf_id is NULL;

dimon555 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.