Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 05.11.2013
Сообщений: 27
1

Возможно ли это вообще запросом выбрать?

24.05.2016, 22:14. Показов 1004. Ответов 8
Метки нет (Все метки)

Есть таблица с техникой. И таблица с тех. осмотрами техники. Нужно выбрать технику с минимальной датой, которая больше текущей, если же у какого-либо элемента таблицы с техникой нет подходящих этому условию осмотров либо их нет вообще, то нужно вывести запись этого элемента, но поле с датой сделать null.
Вот мой запрос:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT DISTINCT(Techn.id), Techn_types.name, Techn.name, Techn.inv_numb, Techn.gos_numb, Techn.manufact_date, Techn.purchase_date, Techn.input_date, Techn.period, MIN(Service.date) AS sled_service
        FROM Techn
        INNER JOIN Techn_types ON Techn_types.id = Techn.id_type
        LEFT JOIN Service ON Service.id_techn = Techn.id
        WHERE Service.date>=CONVERT(DATE, GETDATE()) OR Service.date <CONVERT(DATE, GETDATE())
        GROUP BY Techn.id, Techn_types.name, Techn.name, Techn.inv_numb, Techn.gos_numb, Techn.manufact_date, Techn.purchase_date, Techn.input_date, Techn.period
        UNION
        SELECT Techn.id, Techn_types.name, Techn.name, Techn.inv_numb, Techn.gos_numb, Techn.manufact_date, Techn.purchase_date, Techn.input_date, Techn.period, MIN(Service.date) AS sled_service
        FROM Techn
        INNER JOIN Techn_types ON Techn_types.id = Techn.id_type
        LEFT JOIN Service ON Service.id_techn = Techn.id
        WHERE Service.date IS NULL
        GROUP BY Techn.id, Techn_types.name, Techn.name, Techn.inv_numb, Techn.gos_numb, Techn.manufact_date, Techn.purchase_date, Techn.input_date, Techn.period
        ORDER BY Techn.name ASC;
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.05.2016, 22:14
Ответы с готовыми решениями:

Кто может это переработать для андроида? И вообще это возможно?
програма на CLI (windows form)

Возможно ли это вообще в Word?
Можно ли сделать так, чтобы в ворде (при наличии текста и рисунка в документе) определенное...

Как найти правильные числа. И возможно ли это вообще?
Дано такое условие a &gt; b b &gt; c a &lt; c Какие простые числа подходят для выполнение такого...

Delphi + Windows 10 = С чего начинать? (Это вообще возможно)?
Здравствуйте дорогие форумчане! Захотелось мне создать программу на Delphi. Дай-ка, думаю, хоть...

8
3203 / 1941 / 689
Регистрация: 02.06.2013
Сообщений: 4,757
24.05.2016, 22:27 2
Лучший ответ Сообщение было отмечено Despodd как решение

Решение

T-SQL
1
2
3
4
5
6
select
 t.id, tt.name, t.name, t.inv_numb, t.gos_numb, t.manufact_date, t.purchase_date, t.input_date, t.period, s.[date]
from
 Techn t join
 Techn_types tt on tt.id = t.id_type outer apply
 (select top (1) [date] from Service where id_techn = t.id and [date] > getdate() order by [date]) s;
1
0 / 0 / 0
Регистрация: 05.11.2013
Сообщений: 27
24.05.2016, 22:36  [ТС] 3
Спасибо большое. Ох какие же у меня скудные знания sql: я даже не понимаю как изложенная Вами конструкция работает.
0
3203 / 1941 / 689
Регистрация: 02.06.2013
Сообщений: 4,757
24.05.2016, 22:42 4
Лучший ответ Сообщение было отмечено Despodd как решение

Решение

Цитата Сообщение от Despodd Посмотреть сообщение
Ох какие же у меня скудные знания sql
Дело поправимое - Чудесный оператор CROSS APPLY
1
43 / 43 / 11
Регистрация: 04.04.2012
Сообщений: 122
24.05.2016, 23:18 5
Despodd, Функция GETDATE() возвращает значение типа Дата, его не нужно дополнительно конвертировать в Дату.
А Ваша конструкция Service.date>= GETDATE() or Service.date<GETDATE()
мне вообще непонятна. Эта строка всегда возвращает значение ИСТИНА.
Ваш запрос можно записать в таком виде:
T-SQL
1
2
3
4
5
6
SELECT DISTINCT(Techn.id), Techn_types.name, Techn.name, Techn.inv_numb, Techn.gos_numb, Techn.manufact_date, Techn.purchase_date, Techn.input_date, Techn.period, MIN(Service.DATE) AS sled_service
        FROM Techn
        INNER JOIN Techn_types ON Techn_types.id = Techn.id_type
        LEFT JOIN Service ON Service.id_techn = Techn.id
        WHERE Service.date is null or Service.date>=GETDATE()
        GROUP BY Techn.id, Techn_types.name, Techn.name, Techn.inv_numb, Techn.gos_numb, Techn.manufact_date, Techn.purchase_date, Techn.input_date, Techn.period
Добавлено через 3 минуты
Или еще изящнее:
T-SQL
1
2
3
4
5
SELECT DISTINCT(Techn.id), Techn_types.name, Techn.name, Techn.inv_numb, Techn.gos_numb, Techn.manufact_date, Techn.purchase_date, Techn.input_date, Techn.period, MIN(Service.DATE) AS sled_service
        FROM Techn
        INNER JOIN Techn_types ON Techn_types.id = Techn.id_type
        LEFT JOIN Service ON (Service.id_techn = Techn.id and Service.date>=GETDATE())
        GROUP BY Techn.id, Techn_types.name, Techn.name, Techn.inv_numb, Techn.gos_numb, Techn.manufact_date, Techn.purchase_date, Techn.input_date, Techn.period
Добавлено через 2 минуты
Да, и DISTINCT там явно лишний. Хотя он не мешает.

Добавлено через 13 минут
Цитата Сообщение от Despodd Посмотреть сообщение
Ох какие же у меня скудные знания sql
Да нормальные знания.
Только имейте в виду, что значение NULL не получится сравнить с чем-то не NULL. Поэтому сравнение с текущей датой нужно вынести в предложение LEFT JOIN ... ON (<вот сюда>), либо использовать функцию ISNULL(), которая значению NULL назначает значение не NULL, как бы "по умолчанию".
0
0 / 0 / 0
Регистрация: 05.11.2013
Сообщений: 27
24.05.2016, 23:29  [ТС] 6
Цитата Сообщение от i-sm Посмотреть сообщение
Despodd, Функция GETDATE() возвращает значение типа Дата, его не нужно дополнительно конвертировать в Дату
Хм, и вправду логично, но, когда я не преобразовывал, оно почему-то дату из БД считало меньше, чем дату, которую возвращает эта ф-ция. Вот я и подумал, что ф-ция Getdate возвращает значение datetime, а при сравнении неявно преобразует дату из бд в тип datetime и получается такая штука.

Цитата Сообщение от i-sm Посмотреть сообщение
А Ваша конструкция Service.date>= GETDATE() or Service.date<GETDATE()
А это уже от безвыходности хотел выбирать из БД значения с датой больше текущего, а в обратном случае уже те, которые остались, чтобы потом программно уже вместо дат меньше текущей выставлять null.

Цитата Сообщение от i-sm Посмотреть сообщение
Или еще изящнее
Хм, достаточно интересное решение и не сложное, но мне даже как-то и в голову не пришло, что в условии соединения таблиц может быть более одного условия.

Добавлено через 3 минуты
Цитата Сообщение от i-sm Посмотреть сообщение
Да, и DISTINCT там явно лишний. Хотя он не мешает.
А это я забыл убрать, у меня изначально был вариант другой и там нужно было, чтобы оно не брало несколько записей для одного и того же элемента таблицы techn, а мой запрос выводил именно несколько.

Добавлено через 33 секунды
Всем огромное спасибо за решения да ещё и пояснения с ссылками на материал.
0
1083 / 733 / 175
Регистрация: 27.11.2009
Сообщений: 2,178
25.05.2016, 10:45 7
Цитата Сообщение от i-sm Посмотреть сообщение
значение NULL не получится сравнить с чем-то не NULL
А с NULL, значит, получится?
С NULL надо использовать операторы IS NULL или IS NOT NULL
0
43 / 43 / 11
Регистрация: 04.04.2012
Сообщений: 122
25.05.2016, 11:30 8
Цитата Сообщение от iap Посмотреть сообщение
Цитата Сообщение от i-sm Посмотреть сообщение
значение NULL не получится сравнить с чем-то не NULL
А с NULL, значит, получится?
Железная логика!
Что ж, отвечу: НЕ ЗНАЧИТ.
Цитата Сообщение от iap Посмотреть сообщение
С NULL надо использовать операторы IS NULL или IS NOT NULL
Вот как хорошо, что Вы внимательно прочитали мое первое решение задачи ТС!

Добавлено через 12 минут
Кстати, и второе решение посмотрите. А то так и будете CROSS APPLY-и лепить, куда не нужно.
0
12 / 12 / 3
Регистрация: 20.11.2013
Сообщений: 123
25.05.2016, 11:35 9
Цитата Сообщение от i-sm Посмотреть сообщение
Да, и DISTINCT там явно лишний. Хотя он не мешает.
Не нужен
T-SQL
1
DISTINCT
. Его вообще лучше не использовать. Это очень тяжёлая операция.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.05.2016, 11:35

Нужно расшифровать, если это вообще как-то возможно
yadi.sk/i/7/3/100000,(big)9/1/010,9/5/1000000,(big)7/5/100,_,7/3/100000,(big)1/3/00100000000,9/5/100...

Как записать в вектор структуру? Это вообще возможно сделать?
Привет всем! Как записать в вектор структуру? Это вообще возможно сделать? Надо, чтоб первая...

как можно сделать это? если вообще возможно (не задача)
есть задача, на двумерный массив... вывел массив 5х5 с рандомными числами, нужно найти числа...

Поломал голову над SQL запросом из 5-ти таблиц. Возможно ли это?
Всем привет. Есть 3 основные таблицы: customers, subscribers, contacts. Также 2 вспомогательные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru