Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите написать запрос  [new]
fox_trot
Member

Откуда:
Сообщений: 2
Есть 2 таблички:
Warehouse с полями VehicleId, StartDate, EndDate
Claims с полями VehicleId, ClaimNumber, CreationDate

Нужно получить таблицу с полями VehicleId, StartDate, EndDate, ClaimNumber, CreationDate
такую, чтобы туда
1. вошли все VehicleId со значением ClaimNumber = значение, для которых выполняется условие (CreationDate <= StartDate и CreationDate > EndDate)
2. вошла только 1 запись со значением ClaimNumber = null, если НЕ выполняется условие (CreationDate <= StartDate и CreationDate > EndDate)
20 окт 13, 12:42    [15004186]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2392
Блог
fox_trot
Есть 2 таблички:
Warehouse с полями VehicleId, StartDate, EndDate
Claims с полями VehicleId, ClaimNumber, CreationDate

Нужно получить таблицу с полями VehicleId, StartDate, EndDate, ClaimNumber, CreationDate
такую, чтобы туда
1. вошли все VehicleId со значением ClaimNumber = значение, для которых выполняется условие (CreationDate <= StartDate и CreationDate > EndDate)
2. вошла только 1 запись со значением ClaimNumber = null, если НЕ выполняется условие (CreationDate <= StartDate и CreationDate > EndDate)
Очень хорошо. Предложите свой вариант запроса, посмотрим где там могут быть проблемы.
20 окт 13, 16:48    [15004707]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Элементарно
Guest
fox_trot
Есть 2 таблички:
Warehouse с полями VehicleId, StartDate, EndDate
Claims с полями VehicleId, ClaimNumber, CreationDate

Нужно получить таблицу с полями VehicleId, StartDate, EndDate, ClaimNumber, CreationDate
такую, чтобы туда
1. вошли все VehicleId со значением ClaimNumber = значение, для которых выполняется условие (CreationDate <= StartDate и CreationDate > EndDate)
2. вошла только 1 запись со значением ClaimNumber = null, если НЕ выполняется условие (CreationDate <= StartDate и CreationDate > EndDate)

Нужно использовать SELECT
20 окт 13, 16:58    [15004724]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
fox_trot,

Молодец посан )))). Некогда SQL учить, нужно лабу срочно сдать, а не заморачиваться изучением - проще лоха на sql.ru ну и еще где найти - решат на халяву )
20 окт 13, 18:16    [15004896]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
kalimba
Member

Откуда:
Сообщений: 297
Алексей Куренков,

Хорошо если на лабу еще, а не на собеседование.. )
20 окт 13, 18:19    [15004902]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
fox_trot
Member

Откуда:
Сообщений: 2
Прошу прощения, что мое сообщение показалось всем сообщением ленивца, который не хочет ничего делать самостоятельно - это не так. Просто не достаточно опыта еще, думала может подскажете в какую сторону копать хотя бы. И я не "посан", кстати)
Просто реально не приходит в голову ничего более умного, чем использование UNION.
Мой вариант что-то типа такого:

select VehicleId, StartDate, EndDate, ClaimNumber, CreationDate
from Warehouse
left join Claims on Claims.VehicleId = Warehouse.VehicleId
where (Claims.CreationDate >= Warehouse.StartDate and Claims.CreationDate < Warehouse.EndDate) or Claims.CreationDate is null
UNION
select VehicleId, StartDate, EndDate, null as ClaimNumber, null as CreationDate
from Warehouse
left join Claims on Claims.VehicleId = Warehouse.VehicleId
where Claims.CreationDate < Warehouse.StartDate and Claims.CreationDate > Warehouse.EndDate


Подойдет ли такой запрос и можно ли как-то более проще написать, не используя union? Дело в том, что условие я очень упростила, то есть указанная таблица Warehouse появляется в результате немаленького запроса, и использовать ее несколько раз в запросе без лишней необходимости не хотелось бы..
Спасибо всем кто откликнулся :)
21 окт 13, 00:13    [15005946]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
fox_trot
Прошу прощения, что мое сообщение показалось всем сообщением ленивца, который не хочет ничего делать самостоятельно - это не так. Просто не достаточно опыта еще, думала может подскажете в какую сторону копать хотя бы. И я не "посан", кстати)
Просто реально не приходит в голову ничего более умного, чем использование UNION.
Мой вариант что-то типа такого:

select VehicleId, StartDate, EndDate, ClaimNumber, CreationDate
from Warehouse 
left join Claims on Claims.VehicleId = Warehouse.VehicleId
where (Claims.CreationDate >= Warehouse.StartDate and Claims.CreationDate < Warehouse.EndDate) or Claims.CreationDate is null
UNION
select VehicleId, StartDate, EndDate, null as ClaimNumber, null as CreationDate
from Warehouse 
left join Claims on Claims.VehicleId = Warehouse.VehicleId
where Claims.CreationDate < Warehouse.StartDate and Claims.CreationDate > Warehouse.EndDate



Подойдет ли такой запрос и можно ли как-то более проще написать, не используя union? Дело в том, что условие я очень упростила, то есть указанная таблица Warehouse появляется в результате немаленького запроса, и использовать ее несколько раз в запросе без лишней необходимости не хотелось бы..
Спасибо всем кто откликнулся :)


3 проблемы:
1. вы не соблюли первое условие. В первом запросе зачем-то добавили "or Claims.CreationDate is null" - это значит что запрос включит все записи с null, а вам это по условию не надо.

2. Во втором запросе вы скорее всего не получите ни одной записи. Это как раз тот случай когда операция выполнится мгновенно, ибо так как всегда StartDate < EndDate то в датасет не попадёт ни одной записи.
Я-бы предложил вам сделать так: "where not (Claims.CreationDate >= Warehouse.StartDate and Claims.CreationDate < Warehouse.EndDate)" или так: "where Claims.CreationDate < Warehouse.StartDate or Claims.CreationDate >= Warehouse.EndDate"
(обратите особое внимание на знак ">=")

3. Второе условие так и не соблюдено.
И это правильно, ибо условие нуждается в уточнении: Какая одна запись должна быть возвращена?
Если вам всё равно какая, то тогда пишите "SELECT TOP 1 ...", а если нет, то нужно смотреть.
21 окт 13, 05:41    [15006147]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить