Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 25.04.2018, 18:59   #11
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,614
Репутация: 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,098
Репутация: 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,098
Репутация: 6385
По умолчанию

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


22:50.


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

RusProfile.ru


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