Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Запрос


Автор: MihailCarib 19.8.2010, 18:31
Здравствуйте уважаемые форумчане! Прошу не ругать новичка - вопрос простой, но что-то у меня запрос не получается. Ситуация такая: есть база данных Date_mark, в ней есть поле "Дата", есть поле "Фамилия". Я знаю, как выбрать из всех полей таблицы человека с определенной фамилией:

  Form10.Query1.Close;
  Form10.Query1.SQL.Clear;
  Form10.Query1.SQL.Text:='SELECT * FROM Date_mark where Фамилия=:p';
  Form10.Query1.ParamByName('p').Value:= Edit2.Text;
  Form10.Query1.OPEN;

Знаю, как выбрать  дату

Form10.Query1.Close;
  Form10.Query1.SQL.Clear;
  Form10.Query1.SQL.Text:='SELECT * FROM Date_mark where( Дата between :p and :c)';
  Form10.Query1.ParamByName('p').Value:=StrToDate(Edit1.Text);
  Form10.Query1.ParamByName('c').Value:=StrToDate(Edit3.Text);
  Form10.Query1.OPEN;

Но если мне нужно выбрать дату из уже выбранной фамилии, а не из всего "Date_mark", или наоборот, из выбранной даты выбрать только эту фамилию?  Не хочу все делать одновременно, например так: 

Form10.Query1.SQL.Text:='SELECT * FROM Date_mark (where( Дата between :p and :c)) and (where (Фамилия=:p))';

Надо именно выбрать сначала все события с фамилией, а потом из полученного набора выбрать дату (или наоборот). 

Примерчик если можно дайте, пожалуйста!
 

Автор: Keeper89 19.8.2010, 18:52
Цитата(MihailCarib @  19.8.2010,  18:31 Найти цитируемый пост)
Не хочу все делать одновременно, например так: 

Насколько мне известно, это единственный способ...

Автор: Данкинг 19.8.2010, 18:53
Цитата(MihailCarib @  19.8.2010,  19:31 Найти цитируемый пост)
Не хочу все делать одновременно, например так: 

А в чём проблема-то? Нормальный запрос с условием.

Автор: Vas 19.8.2010, 20:14
Цитата(MihailCarib @  19.8.2010,  18:31 Найти цитируемый пост)
Form10.Query1.SQL.Text:='SELECT * FROM Date_mark (where( Дата between :p and :c)) and (where (Фамилия=:p))';

токи where один раз
Код

Form10.Query1.SQL.Text:='SELECT * FROM Date_mark where  Дата between :p and :c  and Фамилия=:p';


Добавлено @ 20:16
Цитата(MihailCarib @  19.8.2010,  18:31 Найти цитируемый пост)
Надо именно выбрать сначала все события с фамилией, а потом из полученного набора выбрать дату (или наоборот). 

А почему именно так, нафига два запроса делать? Одним с составным условием быстрее будет и проще.

Автор: MihailCarib 19.8.2010, 21:54
Мужики, ну я же не просто так от не...  делать сижу тут и нервничаю. Я понимаю, что составной запрос  проще и правильнее, но есть ТЗ, в котором написано именно так и никак иначе. И хоть расшибись. При чем все остальное уже готово, осталось вот только эту "фишку" сделать...

Автор: Frees 19.8.2010, 22:05
дословно что в ТЗ написано?

Добавлено @ 22:09
Код

SELECT *
FROM
(SELECT * FROM Date_mark where( Дата between :p and :c)) S
WHERE s.Фамилия=:f



Код

  Form10.Query1.Close;
  Form10.Query1.SQL.Clear;
  Form10.Query1.SQL.Text:='SELECT * FROM Date_mark where Фамилия=:f';
  Form10.Query1.ParamByName('f').Value:= Edit2.Text;
  Form10.Query1.OPEN;

Form10.Query1.Close;
  Form10.Query1.SQL.Clear;
  Form10.Query1.SQL.Text:='SELECT s.* FROM ('+ Form10.Query1.SQL.Text +') s where( s.Дата between :p and :c)';
  Form10.Query1.ParamByName('f').Value:= Edit2.Text;
  Form10.Query1.ParamByName('p').Value:=StrToDate(Edit1.Text);
  Form10.Query1.ParamByName('c').Value:=StrToDate(Edit3.Text);
  Form10.Query1.OPEN;


глупое решение но и требование, извиняюсь, глупое

Добавлено через 8 минут и 39 секунд
еще такой вариант
Код

  Form10.Query1.Close;
  Form10.Query1.Filtered := False;
  Form10.Query1.SQL.Clear;
  Form10.Query1.SQL.Text:='SELECT * FROM Date_mark where( Дата between :p and :c)';
  Form10.Query1.ParamByName('p').Value:=StrToDate(Edit1.Text);
  Form10.Query1.ParamByName('c').Value:=StrToDate(Edit3.Text);
  Form10.Query1.OPEN;
  Form10.Query1.Filter := 'Фамилия = ' + Edit2.Text;
  Form10.Query1.Filtered := True;

Автор: cat512 22.8.2010, 00:25
smile бред какой-то, таких аналитиков и тз.писателей гнать надо из компании. Люди наоборот боряться за то что-бы лишний раз сервер не нагружать

Добавлено через 7 минут и 41 секунду
ещё можно использовать master-detail query. Может реч идёт о них. Утебя на клиенте будет два набора данных, один с фамилиями другой с датами, с каким хочеш с таким и работай. Или тебе надо всё в одном держать?

Автор: MihailCarib 22.8.2010, 13:55
Согласен, бред. Такое бывает, когда  ТЗ пишут деятели, ни...чего не понимающие в программировании, да и в остальном тоже слабо. Вот деньги они считают круто, мне бы так.  Нашел формальную лазейку в ТЗ, организовал составной запрос. Должны "проглотить", хоть и с боем. Спасибо всем. 

Автор: Deniz 23.8.2010, 07:07
MihailCarib, можно еще локальными фильтрами воспользоваться.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)