Условный переход в SQL

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
angeldev
Сообщения: 6
Зарегистрирован: 13 мар 2006, 14:01

Условный переход в SQL

Сообщение angeldev » 13 мар 2006, 14:07

Меня интерисует следующие.

Есть запрос который возвращает записи из таблицы Table1 по указанной дате, можно ли сделать так что если запись с такой датой не найдена возвращалась бы запись с большей датой?

Применение ХП не подойдет.

Заранее спасибо.

SAMZ
Сообщения: 128
Зарегистрирован: 21 мар 2005, 08:17

Re: Условный переход в SQL

Сообщение SAMZ » 13 мар 2006, 14:14

ХП на все случаи жизни подойдет, только это не условный переход, а условие отбора

angeldev
Сообщения: 6
Зарегистрирован: 13 мар 2006, 14:01

Сообщение angeldev » 13 мар 2006, 14:16

Как реализовать при помощи ХП, я знаю, а как запрос составить?
Вот что меня интересует.

SAMZ
Сообщения: 128
Зарегистрирован: 21 мар 2005, 08:17

Сообщение SAMZ » 13 мар 2006, 14:30

angeldev писал(а):Как реализовать при помощи ХП, я знаю, а как запрос составить?
Вот что меня интересует.
Ну, это мне не кажется проблемой. Можно, например, сформировать в ХП запрос в котором будут отбираться записи по равенству некоторо поля с требуемой датой. Если ни одной записи в набор не попало (это легко контролируется) то можно реализовать отбор по другому условию.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 14 мар 2006, 08:00

angeldev писал(а):Как реализовать при помощи ХП, я знаю, а как запрос составить?
SELECT * FROM TABLE WHERE FIELD >= :YourDate ORDER BY FIELD
и берешь только первую запись.

eg
Сообщения: 17
Зарегистрирован: 09 ноя 2005, 22:33

Re: Условный переход в SQL

Сообщение eg » 14 мар 2006, 08:41

angeldev писал(а):Есть запрос который возвращает записи из таблицы Table1 по указанной дате, можно ли сделать так что если запись с такой датой не найдена возвращалась бы запись с большей датой?

Применение ХП не подойдет.
union all + not exists

angeldev
Сообщения: 6
Зарегистрирован: 13 мар 2006, 14:01

Сообщение angeldev » 14 мар 2006, 09:40

Вот как я решил. Спасибо eg за подсказку.
Остальным за участие.

select * from price p1 join price1 p2 on p1.id = p2.id
and xdate='2006-03-16'
union all
select * from price p1 join price1 p2 on p1.id = p2.id
and xdate<'2006-03-16' and mtr not in
(SELECT mtr
FROM price p1 join price1 p2 on p1.id = p2.id
and xdate='2006-03-16')

angeldev
Сообщения: 6
Зарегистрирован: 13 мар 2006, 14:01

Сообщение angeldev » 14 мар 2006, 10:22

АААА!!!!
Запрос который сделал будет работать только в том случае если первый select вернет результат, иначе все неверно.

SAMZ, я же сказал ХП не подойдет. Я знаю как ее написать и как вызвать, короче я знаю как решить мой вопрос с помощью ХП.

[Еще раз прошу!!!!!!!!!]
Дело в том что таблица это некий список содержащий наименование, цену и дату. необходимо выбрать цены на все товары по указанной дате, если указанной даты нет догда ближайшую. При этом например на 1 марта может быть указана цена и на отвертку и на гайку, а 5 марта только на отвертку. Теперь если мы в качестве параметра для запроса укажем дату 6 марта запрос должен выдать цену на отвертку за 5 марта на гайку за 1 марта.

И если можно дайте ответ конкретней, а не в воздух. Синтаксис я и так знаю. Мне помощь в конкретной задачке нужна.
Please!!!!!

eg
Сообщения: 17
Зарегистрирован: 09 ноя 2005, 22:33

Сообщение eg » 14 мар 2006, 10:44

angeldev писал(а):АААА!!!!
[Еще раз прошу!!!!!!!!!]
похоже вопрос жизни и смерти
angeldev писал(а): Дело в том что таблица это некий список содержащий наименование, цену и дату.
Именно так? Все в одной таблице?
angeldev писал(а):Теперь если мы в качестве параметра для запроса укажем дату 6 марта запрос должен выдать цену на отвертку за 5 марта на гайку за 1 марта.
схематично:

Код: Выделить всё

select "наименование",
  (
    select first 1 "цена" 
    from "цены"
    where ....
    order by "дата" desc
  )
from "товары"
order ...
если все и вправду в одной таблице, то ой:

Код: Выделить всё

select distinct km1."наименование",
  (
    select first 1 km2."цена" 
    from "кучамала" km2
    where ....
    order by km2."дата" desc
  )
from "кучамала" km1
order ...

angeldev
Сообщения: 6
Зарегистрирован: 13 мар 2006, 14:01

Сообщение angeldev » 14 мар 2006, 11:47

Спасибо, eg!
Таблицы две
поля Table1 (ID, PRICE_NUM, DATE)
Table2 (foreign gey on Table1(ID), PRODUCT, PRICE)

Klyk
Сообщения: 100
Зарегистрирован: 26 окт 2004, 23:28

Сообщение Klyk » 14 мар 2006, 23:34

Может я чего не понимаю, а что за ситуация такая, в котой нельзя использовать ХП, а нужен именно запрос?

ниразу не талкивался я с такой ситуёвиной.

angeldev
Сообщения: 6
Зарегистрирован: 13 мар 2006, 14:01

Сообщение angeldev » 15 мар 2006, 03:36

Hellou, Klyk!
Так вот я тоже не сталкивался.
Это не решение реальной задачи.
Просто я был на собеседовании ну и мне там такой вопрос задали, я было написал ХП, а мне говорят нет. Решить только с помощью запроса. Вот такая фигня блин, бывает не до смеха.

Народ, может кто подскажет как проверить свои знания по SQL. Может где какие-нибуль тестики есть или Вы мне вопросиков подкините которыми можно определить понимает человек SQL или нет.
А то у меня какой-то комплекс неполноценности после такого вопроса появился. Вроде не первый год с FireBird работаю. И проекты есть и Full-text Search делал. А тут с этим вопросом как школьник попался.

Может кому еще понадобится.

select distinct mtr,
(select first 1 p1.price from price1 p1
inner join price p3 on p1.id=p3.id
where p1.mtr = p2.mtr and p3.xdate<='2006-03-16' order by p3.xdate desc)
from price1 p2

Ответить