2012-02-29 2 views
3

Итак, очень простой запрос, но я не уверен, правильно ли я прав, так как я делаю это на бумаге и не имею базы данных, где я могу попробовать. на. Это упражнение для экзамена в колледже. У меня есть эта таблица:Выберите запись с MIN (DATE)

Serv_req 
    ============= 
PK Svr_ID 
    State 
    Req_Date 
    Description 

Они просто просят меня, чтобы показать данные для старейшей Serv_Req, который имеет «Open» в качестве государства.

То, что я написал до сих пор:

SELECT Svr_ID, State, Description, MIN(Req_Date) 
FROM Serv_req 
WHERE State LIKE 'Open' 
GROUP BY Svr_ID, State, Description 

Теперь это будет возвращать только запись с информацией для старейшей Svr_req? или он вернет список ВСЕХ требований «Open» с датой самой старой в конце?

UPDATE

я забыл упомянуть. К сожалению, правила курса не позволяют нам использовать SELECT TOP, LIMIT 1 или даже подзапросы для создания таблиц AUX в инструкции FROM.

Заранее благодарю вас за помощь!

UPDATE 2 Итак, после просмотра первого запроса, который я написал, это совершенно неправильно, я даю ему вторую попытку. Скажите, пожалуйста, если вы считаете, что это правильно:

SELECT Svr_id, State, Description 
FROM Serv_req 
WHERE State LIKE 'Open' 
AND Req_Date = (SELECT MIN(S1.Req_date) 
       FROM Serv_req S1 
       WHERE S1.State LIKE 'Open' 
       ) 

Я знаю, что это не самый ясный/самый исполнительский способ сделать этот запрос, но с ограничением мой курс навязывает, это лучшее, что я мог придумать , Ребята, что вы думаете? Кажется ли это правильным?

+0

Вы уверены, что вам нужно показать, на каком сервере это состояние, и его описание? – gangreen

+0

@gangreen Ну, да, это то, что говорится в книге :). Это может быть немного запутанным, но на самом деле это не серверы, а «Требования к сервису». Так что он спрашивает меня, это показать самое старое требование к сервису, состояние которого «открыто» – nachoargentina

+0

Причина, по которой я спрашивал, состоит в том, что вопрос, как поставлено, не является детерминированным. Что произойдет, если 2 Open Service Requirements упадут на ту же самую точную дату? – gangreen

ответ

1

EDIT Поскольку вы не можете использовать TOP 1 трюк или подзапросы, вы должны прийти с условием, что прописывается определение MIN, используя элементарные «меньше, чем» отношений.

Подумайте о проблеме с точки зрения сравнения каждой записи со всеми записями в одной таблице. Вы можете сделать это, построив самосоединение, чтобы все записи, которые вы выбрали из таблицы, с которой вы соединяетесь, имеют ранее. Будут некоторые записи, для которых невозможно найти пару со строго более ранней датой; это то, что вы хотите. Очевидно, вам понадобится внешний, чтобы привести базовую запись в результаты, потому что совпадения не существует. Запись, которую вы ищете, будет иметь уникальную структуру, позволяющую идентифицировать ее среди записей, которые вы не хотите видеть.

+0

Да, извините, я забыл прояснить. Я не могу «SELECT TOP», или «LIMIT 1», или даже подзапросы в выражении 'FROM': (например, глупо, если вы спросите меня, но это правила курса – nachoargentina

4

Приятно видеть кого-то из ARG :)

Ну, в основном ваш запрос не работает. Вам нужно удалить свой второй SELECT, но просто ключевое слово, а не поля. На вопрос, который вы задаете, я думаю, что вы не совсем получаете GROUP BY.

GROUP BY в этом случае будет принимать все Svr_ID, State, Description, которые различны (то есть, что сделать уникальный кортеж) и MIN(Req_Date) будет принимать минимум из элементов, где сгруппированных по каждому из различных touples.

Теперь, если Svr_ID является PK, ваш GROUP BY фактически не группирует ничего, потому что Svr_ID является «отличным» сам по себе, независимо от полей состояния и описания. Это означает, что запрос такой же, как этот запрос:

SELECT Svr_ID, State, Description, Req_Date 
FROM Serv_req 
WHERE State LIKE 'Open' 

Это немного более понятно?

Edit:

Теперь, вы сказали, что не СУБД, где вы можете попробовать эти запросы, так что позвольте мне представить вам SQLFiddle. Я бы рекомендовал вам любую СУБД, но Oracle, потому что синтаксис для создания новых таблиц и вставки записей может быть немного недружелюбным.

Теперь я также добавляю один ответ на ваш вопрос here. Я не вставляю ответ, чтобы вы не спешили и играли с ним. Таблицы, готовые для игры, - here, так что это должна быть ваша отправная точка для проверки ваших запросов ... но помните, всегда старайтесь сначала их решить на бумаге ... вы не сможете проверить их в экзамен :)

+0

Эй, это для меня сюрприз ну :), ну, в конце концов, это маленький мир. Я обновил свой ответ, чтобы удалить 'SELECT'. Я даже не знаю, откуда это взялось! это была опечатка О 'GROUP BY' Я понимаю, что вы говорите. В основном, этот запрос будет retunr всех записей. Теперь я обновлю свой ответ другим способом, чтобы я мог подумать, что это может сработать. Позвольте мне знать ваши мысли! – nachoargentina

+1

wow, Wow, WOW! Я не могу стрировать, сколько я искал что-то подобное! Спасибо спасибо и спасибо !! Это блестяще, наконец я смогу попробовать свои вопросы! : D На самом деле я попробовал тот, который я обновил в своем статусе, и это сработало! Спасибо, человек! – nachoargentina

+0

Добро пожаловать! Только один совет: поскольку это экзамен, вы должны попытаться избежать этих подзапросов, потому что они не очень эффективны. Не уверен, что вы должны упомянуть об этом в тесте, но это может помочь обосновать решение, если необходимо –

0

Рассматривая это по-другому, вопрос задает старейший Serv_Req. Принимая это буквально, результатом является одна запись, то есть самая старая открытая. В этом случае самая первая попытка («То, что я написал до сих пор:») без предложения Group By даст ответ. KISS - Держите его просто незабываемым

Смежные вопросы