Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с запросом пжалста  [new]
brbrbr
Member

Откуда: дровишки?
Сообщений: 6067
Бобрый день!

Со скулём не очень дружу, а тут задачку подкинули.
Никак не соображу, как запрос написать правильный.

Есть таблица books (id, name) и есть таблица articles (id, book_id, name), связаны по books.id <- articles.book_id.

Необходимо найти все статьи и книги, содержащие в поле name ключевое слово и вывести их в таблицу вида
books.id articles.id

Если ключевое слово найдено в имени книги и эта книга не была раньше включена в таблицу, то следует добавить запись вида books.id, null, а результирующую таблицу отсортировать так, чтобы записи с null-ом были в конце.

Пробовал делать через union:

select a.book_id, a.id
from articles a
where a.name like '%SearchWord%'
union
select b.id, null
from books b
where b.name like '%SearchWord%'

но тут явно присутствуют лишние записи с null для тех книг, которые уже прежде были включены в таблицу.

Как вариант можно сделать "в лоб", добавив проверку not in (select distinct a.book_id from articles where a.name like '%SearchWord%', но лишний поиск довольно дорогой и хочется обойтись без него.
29 июл 11, 13:32    [11044875]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом пжалста  [new]
AmKad
Member

Откуда:
Сообщений: 5308
brbrbr,

with books as
(select 1 id, 'SQL. основы' name union all
 select 2 id, 'T-SQL. основы' name union all
 select 3 id, 'Java для провессионалов' name union all
 select 4 id, 'C# для провессионалов' name union all
 select 5 id, 'Oracle для провессионалов' name union all
 select 6 id, 'MS SQL для провессионалов' name union all
 select 7 id, 'Firebird для провессионалов' name
), articles as
(select 1 id, 1 book_id, 'Оператор SELECT языка SQL' name union all
 select 2 id, 1 book_id, 'Оператор INSERT языка SQL' name union all
 select 3 id, 1 book_id, 'Оператор DELETE языка SQL' name union all
 select 4 id, 2 book_id, 'Курсоры' name union all
 select 5 id, 2 book_id, 'Хранимиые процедуры' name
)
select book_id, id, name, case when id is null then 'Book' else 'Article' end type
from
 (select book_id, id, name, count(*) over (partition by book_id) cnt
  from
   (select book_id, id, name from articles where name like '%SQL%'
    union all
    select id, null, name from books where name like '%SQL%'
   ) s
 )s   
where id is not null or cnt = 1 
order by case when id is null then 1 else 0 end;

book_id     id          name                        type    
----------- ----------- --------------------------- ------- 
1           1           Оператор SELECT языка SQL   Article 
1           2           Оператор INSERT языка SQL   Article 
1           3           Оператор DELETE языка SQL   Article 
2                       T-SQL. основы               Book    
6                       MS SQL для провессионалов   Book    
29 июл 11, 14:04    [11045113]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом пжалста  [new]
brbrbr
Member

Откуда: дровишки?
Сообщений: 6067
Обалдеть.

Пошёл осознавать.
Спасибо огромное!
29 июл 11, 14:10    [11045168]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом пжалста  [new]
AmKad
Member

Откуда:
Сообщений: 5308
AmKad,

Орфографических ошибок наделал море.
29 июл 11, 14:15    [11045213]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить