Задачка с собеседования
От: cse  
Дата: 08.06.13 13:16
Оценка:
Здравствуйте,
Некоторое время назад, собеседовался и задали выполнить задачку на sql. Я SQL только начал изучать и хотел бы узнать решение и разобраться в ней. Помогите пожалуйста. Задача:

Даны 2 таблицы

1) EVENTS – содержит события

__________________________________________________________________
колонка |Тип данных |Описание
__________________________________________________________________
Id |Number(9) not null |Уникальный идентификатор события
Cancelled |Number(1) default 0 not null |Признак отмененного события
Sdate |Number(8) not null |Дата возникновения события или дата его отмены если cancelled=1 в
формате YYYYMMDD
EVENTS_ID_C_NDX |UNIQUE INDEX(ID,CANCELLED) |уникальный составной индекс по полям id и
cancelled
_________________________________________________________________
Для отмененного события в таблице EVENTS могут быть 2 записи – запись с событием и запись с его отменой.

2) Таблица SUSPICIOUS – содержит промежутки времени когда все события были подозрительны
_________________________________________________________________________________________
колонка |Тип данных |Описание
Sdate_from |Number(8) not null |Дата начала периода подозрительных событий
Sdate_to |Number(8) not null |Дата окончания периода подозрительных событий
_________________________________________________________________________________________

Задание: написать запрос, который выдаст идентификаторы подозрительных не отмененных событий.



Сразу у меня возникает вопрос, как 2ую таблицу к первой привязать?
-------------------------
Сергей Ч.
Нижний Новгород
Re: Задачка с собеседования
От: Dair Россия  
Дата: 08.06.13 15:24
Оценка:
select e.id from EVENTS e, SUSPICIOUS s where e.Cancelled = 0 and e.Sdate >= s.Sdate_from and e.Sdate <= s.Sdate_to;

Я не уверен вот прямо-таки в работающем between, для такого хитрого типа надо подумать, как корректно сравнивать значения, но в целом.
Re[2]: Задачка с собеседования
От: cse  
Дата: 08.06.13 15:39
Оценка:
Здравствуйте, Dair, Вы писали:

D>select e.id from EVENTS e, SUSPICIOUS s where e.Cancelled = 0 and e.Sdate >= s.Sdate_from and e.Sdate <= s.Sdate_to;


D>Я не уверен вот прямо-таки в работающем between, для такого хитрого типа надо подумать, как корректно сравнивать значения, но в целом.



Я не понимаю того, что в таблице SUSPICIOUS вообще ничего не говорится о id. Ведь 2 талблицы должны быть однозначно связаны ключом. В задании ничего не говорится, что 2ая таблица имеет какой-то ключ. Там же вообще нет никаких id. Этот момент не ясен. Объясните подробней, пожалуйста.
-------------------------
Сергей Ч.
Нижний Новгород
Re[3]: Задачка с собеседования
От: Dair Россия  
Дата: 08.06.13 15:45
Оценка:
cse>Я не понимаю того, что в таблице SUSPICIOUS вообще ничего не говорится о id.
А зачем он там смертельно нужен? Вообще индекс бы не помешал для скорости, да. Но не обязательно.

cse> Ведь 2 талблицы должны быть однозначно связаны ключом.

Если не секрет, почему ты так думаешь?
Это не так.

cse> В задании ничего не говорится, что 2ая таблица имеет какой-то ключ.

Да и хрен с ней.

cse> Там же вообще нет никаких id.

Ну нету. И что? Какой-то id нужен исключительно для сортировки (т.е., для быстрого поиска по этому id). Ну и для внутренней проверки уникальности данного ключа.

cse> Этот момент не ясен. Объясните подробней, пожалуйста.

Не очень понимаю, что именно объяснить.
Re: Задачка с собеседования
От: wildwind Россия  
Дата: 08.06.13 16:07
Оценка: 2 (1)
Здравствуйте, cse, Вы писали:

cse>Задание: написать запрос, который выдаст идентификаторы подозрительных не отмененных событий.


Методика решения. Описываешь алгоритм своими словами. Затем упрощаешь до предела, следя за однозначностью трактовки. То что получилось, переводится почти дословно с русского на SQL. На этом этапе поможем. И напоследок оптимизация, по желанию.


P.S. Пользуйся тегами [code]
P.P.S. Для решения задачек есть замечательный сервис sqlfiddle.com
Re[3]: Задачка с собеседования
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 08.06.13 16:22
Оценка:
Здравствуйте, cse, Вы писали:

cse>Я не понимаю того, что в таблице SUSPICIOUS вообще ничего не говорится о id. Ведь 2 талблицы должны быть однозначно связаны ключом. В задании ничего не говорится, что 2ая таблица имеет какой-то ключ. Там же вообще нет никаких id. Этот момент не ясен. Объясните подробней, пожалуйста.


Встречный вопрос. Есть таблицы A и B. Что вернет запрос?

SELECT * FROM A, B
Re[4]: Задачка с собеседования
От: cse  
Дата: 08.06.13 17:29
Оценка:
Здравствуйте, Dair, Вы писали:

cse>>Я не понимаю того, что в таблице SUSPICIOUS вообще ничего не говорится о id.

D>А зачем он там смертельно нужен? Вообще индекс бы не помешал для скорости, да. Но не обязательно.

cse>> Ведь 2 талблицы должны быть однозначно связаны ключом.

D>Если не секрет, почему ты так думаешь?
D>Это не так.

Т.е. в данной задаче кол-во записей первой таблицы равно кол-ву записей 2ой таблицы? Я изначально полагал, что они могу быть не равны, поэтому и думал, что нужен уникальный id, чтобы выбирать запись 2ой таблицы, которая соответсвует записи из первой...
-------------------------
Сергей Ч.
Нижний Новгород
Re[2]: Задачка с собеседования
От: cse  
Дата: 08.06.13 17:30
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Здравствуйте, cse, Вы писали:


cse>>Задание: написать запрос, который выдаст идентификаторы подозрительных не отмененных событий.


W>Методика решения. Описываешь алгоритм своими словами. Затем упрощаешь до предела, следя за однозначностью трактовки. То что получилось, переводится почти дословно с русского на SQL. На этом этапе поможем. И напоследок оптимизация, по желанию.



W>P.S. Пользуйся тегами [code]

W>P.P.S. Для решения задачек есть замечательный сервис sqlfiddle.com

Спасибо за ссылку...
-------------------------
Сергей Ч.
Нижний Новгород
Re[4]: Задачка с собеседования
От: cse  
Дата: 08.06.13 17:32
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Здравствуйте, cse, Вы писали:


cse>>Я не понимаю того, что в таблице SUSPICIOUS вообще ничего не говорится о id. Ведь 2 талблицы должны быть однозначно связаны ключом. В задании ничего не говорится, что 2ая таблица имеет какой-то ключ. Там же вообще нет никаких id. Этот момент не ясен. Объясните подробней, пожалуйста.


M>Встречный вопрос. Есть таблицы A и B. Что вернет запрос?


M>
SELECT * FROM A, B


Интересная задача. Пойду думать.
-------------------------
Сергей Ч.
Нижний Новгород
Re[5]: Задачка с собеседования
От: Dair Россия  
Дата: 08.06.13 18:09
Оценка:
Упрощаем

Таблица A:
FirstName | SecondName
----------+------------
Вася      | Пупкин
Маша      | Лапкина


Таблица B:
  City  | Street               | House
--------+----------------------|----
Москва  | Староколпакский пер. | 28 
Воронеж | ул.Лизюкова          | 13


Других полей в таблицах нет вообще. Никаких индексов и id.

Что выдаст
select * from A, B
?

Подсказка: он выдаст таблицу.

Наводящие вопросы: сколько в таблице будет строк? Столбцов? Какие будут столбцы?
Re[5]: Задачка с собеседования
От: Dair Россия  
Дата: 08.06.13 18:11
Оценка:
cse>Т.е. в данной задаче кол-во записей первой таблицы равно кол-ву записей 2ой таблицы?
Нет, количества произвольны.
Re[6]: Задачка с собеседования
От: cse  
Дата: 08.06.13 19:31
Оценка:
Здравствуйте, Dair, Вы писали:

D>Наводящие вопросы: сколько в таблице будет строк? Столбцов? Какие будут столбцы?


Да я понял это. Я изначально думал, что кол-во записей в одной таблице не равно кол-ву записей в другой. Поэтому и начал гадать про таблицу с результатом, в которой будут записи из 1ой таблицы соединены с нужными записями из 2ой таблицы. Если кол-во столбцов в 1ой и 2ой таблицах равно, то всё просто.
-------------------------
Сергей Ч.
Нижний Новгород
Re[7]: Задачка с собеседования
От: Dair Россия  
Дата: 08.06.13 19:34
Оценка:
D>>Наводящие вопросы: сколько в таблице будет строк? Столбцов? Какие будут столбцы?

cse>Да я понял это. Я изначально думал, что кол-во записей в одной таблице не равно кол-ву записей в другой.

Правильно думал.

cse> Поэтому и начал гадать про таблицу с результатом, в которой будут записи из 1ой таблицы соединены с нужными записями из 2ой таблицы. Если кол-во столбцов в 1ой и 2ой таблицах равно, то всё просто.

Не равно.

В моих таблицах A — два столбца и два строки, B — три столбца и две строки. Пусть в A будет 4 строки, ну чтобы было вообще все не равно.
Re[6]: Задачка с собеседования
От: cse  
Дата: 09.06.13 02:55
Оценка:
Здравствуйте, Dair, Вы писали:

D>Подсказка: он выдаст таблицу.


D>Наводящие вопросы: сколько в таблице будет строк? Столбцов? Какие будут столбцы?


Да понятно. По поводу задачи этой, я изначально думал, что кол-во записей в первой таблице может быть не равно кол-ву записей в другой таблице. А если они равны, то тогда всё понятно.
-------------------------
Сергей Ч.
Нижний Новгород
Re: Задачка с собеседования
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 09.06.13 10:33
Оценка:
Здравствуйте, cse, Вы писали:

cse>Сразу у меня возникает вопрос, как 2ую таблицу к первой привязать?


Похоже что задача должна решаться через оператор apply

Что-то вроде такого:

select * from SUSPICIOUS s cross apply (select * from EVENTS e where e.Cancelled = 0 and e.Sdate >= s.Sdate_from and e.Sdate <= s.Sdate_to) as e


Но когда просто две таблицы всегда можно свести к join (если есть ключи) или к декартову произведению (если ключей нет).
Re[2]: Задачка с собеседования
От: AndrewN Россия  
Дата: 10.06.13 06:26
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, cse, Вы писали:


cse>>Сразу у меня возникает вопрос, как 2ую таблицу к первой привязать?


G>Похоже что задача должна решаться через оператор apply


G>Что-то вроде такого:


G>
G>select * from SUSPICIOUS s cross apply (select * from EVENTS e where e.Cancelled = 0 and e.Sdate >= s.Sdate_from and e.Sdate <= s.Sdate_to) as e
G>


G>Но когда просто две таблицы всегда можно свести к join (если есть ключи) или к декартову произведению (если ключей нет).


Как минимум CROSS APPLY не входит в стандарт ANSI SQL. А автор не уточнил, что ему требуется запрос на диалекте MS SQL

Вообще тут достаточно обычного джойна без заморочек, который собственно и привёл первый ответивший. BETWEEN вполне подойдёт для приведённого формата даты.

Но вообще хранить дату в NUMBER — моветон. "фи" авторам задачи, если это конечно не расчет на то, что экзаменуемый обратит на это внимание и выскажет замечение.
--------------------------------------------------------------
Правильно заданный вопрос содержит в себе половину ответа
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.