Алфавитное сравнение двух строк в ГДЕ - PullRequest
0 голосов
/ 29 января 2020

У меня есть Oracle БД и там таблица с именем Books.

Структура книг:

id_book (FK)
name
year

И моя задача - найти пары книг, которые были опубликованы в том же году. Пусть фильмы в парах будут в алфавитном порядке. Так что будет только

first_name Hobit
second_name The Lord of the Rings

И не так:

first_name The Lord of the Rings
second_name Hobit

И год будет таким же, например 2002.

Мое неправильное решение:

SELECT B1.name, B2.name, B1.year FROM Books B1, Books B2
WHERE B1.year = B2.year
AND B1.id_book != B2.id_book
GROUP BY B1.name, B2.name, B1.year HAVING LOWER(B1.name) <= LOWER(B2.name)

1 Ответ

1 голос
/ 29 января 2020

Вы близки к решению.

1) group by не требуется

2) вместо этого! = И <= использование фильтров: <code>a.name < b.name

С такими данными теста

select * from books 
order by year, name;

NAME                        YEAR
--------------------- ----------
Hobit                       2002
OMG Book                    2002
The Lord of the Rings       2002
Do Not Readme Book          2003

Это запрос

select a.name first_name, b.name second_name
from books a
join books b
on a.year = b.year
where a.name < b.name
order by 1,2;

FIRST_NAME            SECOND_NAME          
--------------------- ---------------------
Hobit                 OMG Book             
Hobit                 The Lord of the Rings
OMG Book              The Lord of the Rings

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

Для n книг в указанном году вы получаете n * (n-1) / 2 записей в наборе результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...