Используя соединения, а затем используя только подзапрос?

#sql #oracle #oracle11g #oracle-sqldeveloper

#sql #Oracle #oracle11g #oracle-sqldeveloper

Вопрос:

Хорошо, итак, я делаю некоторую ревизию SQL, и я должен выполнить запрос, чтобы «использовать соединение, а не использовать подзапрос, перечислить издателей, которые публикуют книги по психологии». и придумал это:

 SELECT DISTINCT p.pub_name, t.category
FROM publishers p
INNER JOIN titles t
ON p.pub_id=t.pub_id
WHERE t.category='psychology';
  

Следующая часть — сделать это с помощью подзапроса, но я не уверен, как вы это сделаете, не используя соединения в самом подзапросе? Кроме того, как мне распечатать каждого второго автора?

Ссылка представляет собой вставку в базу данных.

И это схема (я знаю о проблеме со схемой в отношении таблицы скидок, а не моей схемы).

Ответ №1:

Вы можете использовать предложение IN:

 SELECT 
    p.pub_name
FROM 
    publishers p
WHERE 
    p.pub_id IN (SELECT pub_id FROM titles t WHERE t.category = 'psychology)
  

В качестве альтернативы предложение EXISTS, которое немного сложнее, но обычно работает лучше:

 SELECT 
    p.pub_name
FROM 
    publishers p
WHERE 
    EXISTS (SELECT 1 FROM titles t WHERE t.pub_id = p.pub_id AND t.category = 'psychology)
  

Чтобы получить каждого второго автора:

 SELECT 
    a.au_fname,
    a.au_lname
FROM 
    publishers p
JOIN
    titles t ON t.pub_id = p.pub_id
JOIN
    title_author ta ON ta.title_id = t.title_id
JOIN
    authors a ON a.au_id = ta.au_id
WHERE 
    t.category = 'psychology'
    AND a.au_ord = 2
  

Комментарии:

1. О, да, я помню, что делал EXISTS в прошлом году, спасибо.

2. Np 🙂 Взгляните на последний запрос для второго ответа и посмотрите, дает ли он вам то, что вам нужно. Я должен бежать, но надеюсь, что это поможет! Кроме того, вы заметите, что я пропустил DISTINCT, поскольку я не знаю, что на самом деле требуется в этом случае. Используйте его только в том случае, если вам это абсолютно необходимо, так как в конечном итоге вы получите снижение производительности и удобочитаемости 🙂 Мне нужно бежать, но удачи и хорошего дня!