Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

Вернуться   Форум программистов > Web > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 25.04.2018, 18:59   #11
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,615
Репутация: 5352
По умолчанию

Цитата:
Сообщение от Alex_p Посмотреть сообщение
А так - возвращает значение только одного поля nomerto, а нужны все поля.
а тут уже косяк в постановке задачи.

смотрите.
пусть есть такие записи
Код:

nomerto hardware priz
 101    'Бугач'  0
 777    'Рогач'  0
 777    'Апач'   0
 777    'Раздач' 0
 101    'Тягач'  1

что должен вернуть запрос?
конкретно для кода nomerto = 777 ?
Serge_Bliznykov вне форума   Ответить с цитированием
Старый 25.04.2018, 19:04   #12
Stanislav
Квадрокоптерист
ПрофессионалФорумчанин
 
Регистрация: 29.09.2007
Сообщений: 1,802
Репутация: 532
По умолчанию

Если я правильно понял задачу то попробуйте..

Код:

SELECT NOMERTO FROM ( 
	SELECT NOMERTO, PRIZ FROM a1
	WHERE PRIZ <> 1
) AS T1
GROUP BY 
	T1.NOMERTO

Код:


NOMERTO | PRIZ
1           1
2           0
3	     1
3	     0
3           1

должно вернуть 2 строк с NOMERTO 1 и 2


Цитата:
А так - возвращает значение только одного поля nomerto, а нужны все поля.
а если голову включить, например???? нужны все поля? так перечислите их в Select через запятую.. как Вы вообще запросы пишите??
__________________
Я часть той силы, что вечно хочет зла, но вечно совершает благо..

Последний раз редактировалось Stanislav; 25.04.2018 в 19:28.
Stanislav вне форума   Ответить с цитированием
Старый 25.04.2018, 19:41   #13
Alex_p
Пользователь
 
Регистрация: 05.09.2016
Сообщений: 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а тут уже косяк в постановке задачи.

смотрите.
пусть есть такие записи
Код:

nomerto hardware priz
 101    'Бугач'  0
 777    'Рогач'  0
 777    'Апач'   0
 777    'Раздач' 0
 101    'Тягач'  1

что должен вернуть запрос?
конкретно для кода nomerto = 777 ?
Да. Вы правы. Косяк в постановке. О разных значения в других полях я не подумал. Просто мне в задаче всё равно запись с каким значением других полей, кроме полей nomerto и nameto (а они взаимно зависимы) выберет запрос по priz=0...
Alex_p вне форума   Ответить с цитированием
Старый 25.04.2018, 20:00   #14
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,106
Репутация: 6385
По умолчанию

Цитата:
Просто мне в задаче всё равно запись с каким значением других полей, кроме полей nomerto и nameto (а они взаимно зависимы) выберет запрос по priz=0...
Тогда не выбирай другие поля или выбери с помощью агрегатной функции типа max или min и группировкой по nomerto. А выбирать любые мускул умеет, а огнептица ни капли
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума   Ответить с цитированием
Старый 26.04.2018, 00:01   #15
Alex_p
Пользователь
 
Регистрация: 05.09.2016
Сообщений: 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а если так попробовать:
Код:

select * from a1 where nomerto  not in (select nomerto  from a1 where priz=1)

А как доработать этот запрос, чтобы он выбирал только записи с самой новой датой в поле dataoper для каждой выбранной этим запросом nomerto?

Последний раз редактировалось Alex_p; 26.04.2018 в 10:55. Причина: уточнение
Alex_p вне форума   Ответить с цитированием
Старый 26.04.2018, 00:06   #16
Stanislav
Квадрокоптерист
ПрофессионалФорумчанин
 
Регистрация: 29.09.2007
Сообщений: 1,802
Репутация: 532
По умолчанию

Код:

SELECT NOMERTO FROM ( 
	SELECT NOMERTO, PRIZ FROM a1
	WHERE PRIZ <> 1
) AS T1
GROUP BY 
	T1.NOMERTO 
ORDER BY dataoper DESC

__________________
Я часть той силы, что вечно хочет зла, но вечно совершает благо..
Stanislav вне форума   Ответить с цитированием
Старый 26.04.2018, 09:47   #17
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 18,106
Репутация: 6385
По умолчанию

Если твоя огнептица поддерживает аналитические функции, то здесь пример выборки первой записи из каждой группы. Там же и пример такой выборки без аналитических функций
__________________
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума   Ответить с цитированием
Старый 26.04.2018, 21:33   #18
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,615
Репутация: 5352
По умолчанию

Цитата:
Сообщение от Alex_p Посмотреть сообщение
А как доработать этот запрос, чтобы он выбирал только записи с самой новой датой в поле dataoper для каждой выбранной этим запросом nomerto?
без БД и без возможности попробовать трудно в уме сочинять сложные запросы.
Банально не знаешь - "съест" СУБД такую конструкцию или есть какие-то ограничения.

ну, попробуйте такой запрос:

Код:

select a1.nomerto, a1.Hardware, a1.dataoper
from a1 
INNER JOIN (
select max(temp0.dataoper) as MaxDate, temp0.nomerto  
from a1 temp0 
where temp0.nomerto not in 
   (select temp2.nomerto from a1 temp2 where temp2.priz=1)
GROUP BY temp0.nomerto
) AS t2
  ON a1.nomerto = t2.nomerto 
  AND a1.dataoper = t2.MaxDate

Serge_Bliznykov вне форума   Ответить с цитированием
Старый 26.04.2018, 21:46   #19
Stanislav
Квадрокоптерист
ПрофессионалФорумчанин
 
Регистрация: 29.09.2007
Сообщений: 1,802
Репутация: 532
По умолчанию

Serge_Bliznykov я бы функцию rank over использовал вместо max и еще одного select http://www.firebirdfaq.org/faq343/ 3 птица его поддерживает
__________________
Я часть той силы, что вечно хочет зла, но вечно совершает благо..
Stanislav вне форума   Ответить с цитированием
Старый 26.04.2018, 22:07   #20
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,615
Репутация: 5352
По умолчанию

Цитата:
Сообщение от Stanislav Посмотреть сообщение
я бы функцию rank over использовал вместо max и еще одного select
так напишите, думаю, что ТС это пригодится (хотя бы в качестве варианта или попытки).
я не готов переписать свой пример через rank over...


Цитата:
Сообщение от Stanislav Посмотреть сообщение
3 птица
так я же и говорю, неизвестно, какая версия FireBird и что она поддерживает.
Serge_Bliznykov вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите сформировать правильно запрос Anriuser SQL, базы данных 10 01.06.2017 22:05
Помогите сформировать запрос к БД на удаление записей Kvinto БД в Delphi 2 24.10.2016 13:13
сформировать запрос megostudent Свободное общение 6 22.01.2012 21:41
сформировать запрос Ghennadiy Общие вопросы Delphi 2 12.02.2011 18:58
сформировать запрос _ILYA_ Общие вопросы C/C++ 2 24.10.2010 20:06


02:14.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru