Здравствуйте,
Некоторое время назад, собеседовался и задали выполнить задачку на 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ую таблицу к первой привязать?
-------------------------
Сергей Ч.
Нижний Новгород
Здравствуйте, 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. Этот момент не ясен. Объясните подробней, пожалуйста.
-------------------------
Сергей Ч.
Нижний Новгород
cse>Я не понимаю того, что в таблице SUSPICIOUS вообще ничего не говорится о id.
А зачем он там смертельно нужен? Вообще индекс бы не помешал для скорости, да. Но не обязательно.
cse> Ведь 2 талблицы должны быть однозначно связаны ключом.
Если не секрет, почему ты так думаешь?
Это не так.
cse> В задании ничего не говорится, что 2ая таблица имеет какой-то ключ.
Да и хрен с ней.
cse> Там же вообще нет никаких id.
Ну нету. И что? Какой-то id нужен исключительно для сортировки (т.е., для быстрого поиска по этому id). Ну и для внутренней проверки уникальности данного ключа.
cse> Этот момент не ясен. Объясните подробней, пожалуйста.
Не очень понимаю, что именно объяснить.
Здравствуйте, cse, Вы писали:
cse>Задание: написать запрос, который выдаст идентификаторы подозрительных не отмененных событий.
Методика решения. Описываешь алгоритм своими словами. Затем упрощаешь до предела, следя за однозначностью трактовки. То что получилось, переводится почти дословно с русского на SQL. На этом этапе поможем. И напоследок оптимизация, по желанию.
P.S. Пользуйся тегами [code]
P.P.S. Для решения задачек есть замечательный сервис sqlfiddle.com
Здравствуйте, cse, Вы писали:
cse>Я не понимаю того, что в таблице SUSPICIOUS вообще ничего не говорится о id. Ведь 2 талблицы должны быть однозначно связаны ключом. В задании ничего не говорится, что 2ая таблица имеет какой-то ключ. Там же вообще нет никаких id. Этот момент не ясен. Объясните подробней, пожалуйста.
Встречный вопрос. Есть таблицы A и B. Что вернет запрос?
Здравствуйте, Dair, Вы писали:
cse>>Я не понимаю того, что в таблице SUSPICIOUS вообще ничего не говорится о id. D>А зачем он там смертельно нужен? Вообще индекс бы не помешал для скорости, да. Но не обязательно.
cse>> Ведь 2 талблицы должны быть однозначно связаны ключом. D>Если не секрет, почему ты так думаешь? D>Это не так.
Т.е. в данной задаче кол-во записей первой таблицы равно кол-ву записей 2ой таблицы? Я изначально полагал, что они могу быть не равны, поэтому и думал, что нужен уникальный id, чтобы выбирать запись 2ой таблицы, которая соответсвует записи из первой...
-------------------------
Сергей Ч.
Нижний Новгород
Здравствуйте, wildwind, Вы писали:
W>Здравствуйте, cse, Вы писали:
cse>>Задание: написать запрос, который выдаст идентификаторы подозрительных не отмененных событий.
W>Методика решения. Описываешь алгоритм своими словами. Затем упрощаешь до предела, следя за однозначностью трактовки. То что получилось, переводится почти дословно с русского на SQL. На этом этапе поможем. И напоследок оптимизация, по желанию.
W>P.S. Пользуйся тегами [code] W>P.P.S. Для решения задачек есть замечательный сервис sqlfiddle.com
Спасибо за ссылку...
-------------------------
Сергей Ч.
Нижний Новгород
Здравствуйте, Mystic, Вы писали:
M>Здравствуйте, cse, Вы писали:
cse>>Я не понимаю того, что в таблице SUSPICIOUS вообще ничего не говорится о id. Ведь 2 талблицы должны быть однозначно связаны ключом. В задании ничего не говорится, что 2ая таблица имеет какой-то ключ. Там же вообще нет никаких id. Этот момент не ясен. Объясните подробней, пожалуйста.
M>Встречный вопрос. Есть таблицы A и B. Что вернет запрос?
M>
SELECT * FROM A, B
Интересная задача. Пойду думать.
-------------------------
Сергей Ч.
Нижний Новгород
Здравствуйте, Dair, Вы писали:
D>Наводящие вопросы: сколько в таблице будет строк? Столбцов? Какие будут столбцы?
Да я понял это. Я изначально думал, что кол-во записей в одной таблице не равно кол-ву записей в другой. Поэтому и начал гадать про таблицу с результатом, в которой будут записи из 1ой таблицы соединены с нужными записями из 2ой таблицы. Если кол-во столбцов в 1ой и 2ой таблицах равно, то всё просто.
-------------------------
Сергей Ч.
Нижний Новгород
D>>Наводящие вопросы: сколько в таблице будет строк? Столбцов? Какие будут столбцы?
cse>Да я понял это. Я изначально думал, что кол-во записей в одной таблице не равно кол-ву записей в другой.
Правильно думал.
cse> Поэтому и начал гадать про таблицу с результатом, в которой будут записи из 1ой таблицы соединены с нужными записями из 2ой таблицы. Если кол-во столбцов в 1ой и 2ой таблицах равно, то всё просто.
Не равно.
В моих таблицах A — два столбца и два строки, B — три столбца и две строки. Пусть в A будет 4 строки, ну чтобы было вообще все не равно.
Здравствуйте, Dair, Вы писали:
D>Подсказка: он выдаст таблицу.
D>Наводящие вопросы: сколько в таблице будет строк? Столбцов? Какие будут столбцы?
Да понятно. По поводу задачи этой, я изначально думал, что кол-во записей в первой таблице может быть не равно кол-ву записей в другой таблице. А если они равны, то тогда всё понятно.
-------------------------
Сергей Ч.
Нижний Новгород
Здравствуйте, 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 — моветон. "фи" авторам задачи, если это конечно не расчет на то, что экзаменуемый обратит на это внимание и выскажет замечение.
--------------------------------------------------------------
Правильно заданный вопрос содержит в себе половину ответа