Погите c SQL запросом

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Погите c SQL запросом

Сообщение Sebas » 07.04.2004 (Ср) 20:33

Есть 2 таблицы

1. Список товаров:
Товары(НомерТовара as INTEGER, ИмяТовара as String)

2. Список продаж:
Продажы(НомерПродажи as Integer, ДатаПродажи as Date,НомерТовара as Integer)

как построить запрос чтоб получить полный список товаров,
чтоб напротив каждого товара стоял ПОСЛЕДНЕЙ по дате НомерПродажи .

Спасибо!
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 08.04.2004 (Чт) 9:35

Какая СУБД? Если Access, то используй предикатив TOP (select top 1), предварительно отсортировав выборку по убыванию даты.
Можно еще попробовать так (только у меня сейчас не на чем проверить):
Код: Выделить всё
select GOODS.NUM, GOODS.NAME, SOLDS.DATE
from GOODS, SOLDS
where GOODS.NUM = SOLDS.GOOD_NUM(+)
  and SOLDS.DATE =
    (
      select max(DATE)
      from SOLDS
      where GOOD_NUM = GOODS.NUM
    )

Здесь (+) - объединить СОВПАДАЮЩИЕ строки из левой таблицы и ВСЕ строки из правой таблице (в Access вместо него по-моему RIGHT OUTER JOIN).
Lasciate ogni speranza, voi ch'entrate.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 08.04.2004 (Чт) 17:38

Так, если я всё правильно понял, то не важно какая СУБД.. Вот запрос:

SELECT Goods.GoodName, Last(Sales.SaleID) AS [Last-SaleID], Last(Sales.SaleDate) AS [Last-SaleDate]
FROM Goods INNER JOIN Sales ON Goods.GoodID = Sales.GoodID
GROUP BY Goods.GoodName;

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 09.04.2004 (Пт) 10:08

Scuder, да ну? А ты знаешь, что Last не соответствует стандарту SQL (ANSI SQL-92)? Впрочем, как и inner join, в Oracle (и не только) он работать не будет.
Lasciate ogni speranza, voi ch'entrate.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 09.04.2004 (Пт) 10:59

Да, насчёт Last в SQL ты прав.. :-)
Насчёт ORACLE - не думаю, что СУБД является именно он, впрочем так же не думаю, что это MS SQL. Скорее всего ACCESS. В нём работать будет..

Если всё-таки MS SQL или ORACLE, то запрос, как таковой, в принципе, не нужен. Можно 2 рекордсета использовать - скорость позволяет..

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 09.04.2004 (Пт) 12:46

Большой человек, о чем это он? о какой такой скорости? у него наверное еще и памяти под 4 гига в запасе припрятано... :)
Ты это ему расскажи. Я уже пять болтов отвинтил, и конца не видно... (озадаченно) А это в какую сторону тянуть? Ну-ка... Ага, этот был лишний, этот вообще не отсюда, и этот... Точно, два болта.

Welcome to IRC

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 09.04.2004 (Пт) 13:49

Не припрятано! :-)
Я о скорости работы и обработки запросов Access и MS SQL..

Cyrax
Cyberninja
Cyberninja
Аватара пользователя
 
Сообщения: 891
Зарегистрирован: 25.04.2002 (Чт) 21:20
Откуда: Magnitogorsk, Russia

Сообщение Cyrax » 10.04.2004 (Сб) 11:10

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

Welcome to IRC

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 12.04.2004 (Пн) 9:50

Мне кажется, мы уже от темы отошли.. В вопросе не было условий относительно ресурсов.. И если невозможно создать запрос отвечающий изначальным требованиям, то по-любому придётся использовать 2 рекордсета. В случае с MS SQL, конечно, лучше написать хранимую процедуру.

P.S. Я в своих приложениях и по 3-4 рекордсета использую. Причём и DAO и ADO одновременно. Нормально всё работает, никто не жалуется. У меня комп, в принципе, достаточно мощный, но и на Celeron-800/128 Mb программы достаточно быстро обрабатывают сотни тысяч записей в таблицах.. Тут же ещё очень большое значение имеет структура БД. Если изначально грамотно разработать, то и обрабатывать потом быстрее будет..


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList