Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

Помогите с SQL   Найти похожие ветки 

 
Вика   (2004-08-13 14:45) [0]

Помогите с написанием SQL для решения следующей задачи:

есть постоянная таблица карточек, еженедельно из другой проги с некоторую таблицу выгружатся карточки со полем статуса "USED". Эту самую табличку надо стравнить с постоянной таблицей карточек и поменять у соответствующих карточек статус "AVAILABLE" на "USED" и проставить в поле statuschange дату изменения статуса.


 
Skyle ©   (2004-08-13 14:58) [1]

Что за БД, имена полей, таблиц в студию...


 
Квэнди ©   (2004-08-13 15:00) [2]

Поподробней задачу опиши (имеется ввиду среду).. и условия...
Как ето надо сделать? одним запросом или не важно? позволяется ли создание временной таблицы...


 
Квэнди ©   (2004-08-13 15:01) [3]

Поподробней задачу опиши (имеется ввиду среду).. и условия...
Как ето надо сделать? одним запросом или не важно? позволяется ли создание временной таблицы...


 
Квэнди ©   (2004-08-13 15:01) [4]

сори


 
1008 ©   (2004-08-13 15:02) [5]

А данные во второй таблице дублируют постоянную?


 
Вика   (2004-08-13 15:04) [6]

2 Skyle ©
Постоянная таблица:

id
seria
status
numSeller
dateStatusChange

Временная таблица все тоже самое, только значения всех полей status = "USED".


 
Вика   (2004-08-13 15:05) [7]

Временная таблица это навеоное не совсем правильный я термин употребила, т.е. имелось в ивду таблица, в которую данные загружаются  с периодичность раз в неделю. Используется БД MS Access, ADO в Delphi.


 
1008 ©   (2004-08-13 15:07) [8]

Вика  (13.08.04 15:05) [7]

Если статус в постоянной таблице всё-равно будет изменён на USED, то почему бы его сразу не изменять? Тогда отпадёт необходимость переноса.


 
Skyle ©   (2004-08-13 15:09) [9]

Есть таблица - справочкик (постоянная). Есть некоторая таблица, в которой перечислен список карточек со статусом Used.
Требуется для этого списка в постоянной таблице поставить дату (dateStatusChange) и Status в "Used".
Связь таблиц по ID.

Я правильно понял?
То есть, изменить нужно постоянную таблицу, так?


 
Вика   (2004-08-13 15:11) [10]

2 1008 ©  

В этой таблице только часть всеобщей таблицы, подмножество записей у которых status = "USED". Это значит в другой программе за неделю изменились статусы некоторых карточек, и в эту "временную" таблицу выгружается это подмножество записей со статусом "used". В то время как всеобщая таблица не изменяется и надо ее сравнить с этой временной и изменить статусы у соттветствующих записей.


 
Skyle ©   (2004-08-13 15:15) [11]

А в чём именно сложность заключается?


 
Вика   (2004-08-13 15:16) [12]

2 Skyle ©  

Сложность - в общем-то в том, что я не знаю как этот запрос написать на SQL :(


 
Skyle ©   (2004-08-13 15:26) [13]

UPDATE ConstTable
SET ConstTable.Status = T.Status,
   ConstTable.dateStatusChange = T.dateStatusChange
FROM TempTable T
WHERE ConstTable.Id = T.ID


Оно?
ConstTable - постоянная таблица, TempTable - еженедельная.


 
1008 ©   (2004-08-13 15:31) [14]

Вика  (13.08.04 15:11) [10]

Например:
1. отсортировать постоянную таблицу по статусу "UNUSED" (или как он у вас обозначен);
2. пройтись по отсортированным записям и сравнить есть ли данная текущая запись во "временной" таблице;
2.1. если есть, то внести изменения в постоянную таблицу
2.2. смотрим следующую запись.


 
46_55_41_44 ©   (2004-08-13 15:52) [15]

Нужно делать программно... все С SQL не сделаешь.. могу помочь, если хошь...


 
Ega23 ©   (2004-08-13 15:59) [16]

Нужно делать программно... все С SQL не сделаешь.

Да ну?


 
Чайник   (2004-08-13 16:01) [17]

46_55_41_44:
Мда... оригинально.. приведи пожалуйста пример того что нельзя сделать на sql?


 
Квэнди ©   (2004-08-13 16:03) [18]

Нужно делать программно... все С SQL не сделаешь.. могу помочь, если хошь...

Очень интересное заявление, а вы вкурсе что большинство приложений, разработанных для обработки баз дынных используют Delphi исключительно как визуальную оболочку?


 
46_55_41_44 ©   (2004-08-13 16:04) [19]

Ирония не уместна помоему...


 
Ega23 ©   (2004-08-13 16:07) [20]

Ирония не уместна помоему...

Отнюдь. Что такое технология "клиент-сервер"?


 
Квэнди ©   (2004-08-13 16:08) [21]

46_55_41_44:
ето не ирония, а просто удивление.... кстати, Чайник очень правильно сказал: приведите пример...


 
Квэнди ©   (2004-08-13 16:11) [22]

46_55_41_44: И еще вопрос: вы много приложений написали, использующих SQL?.. по-мойму нет, совет вам один: почитайте подробное описание SQL и, возможно, тогда вы передумаете....
А вот про клиент сервер.... ждем ответа :)


 
Ega23 ©   (2004-08-13 16:13) [23]

приведите пример...

Я только один знаю - когда в качестве БД используешь плоские файлы собственного формата. Так делать, теоретическиЮ можно. Практически - изврат.


 
Квэнди ©   (2004-08-13 16:18) [24]

Ega23 ... ето сложно назвать примером по теме :) так как подразумевается пример с использование БД существующих форматов... а в частности разговор шел о SQL.. так что посмотрим на пример :))


 
Вика   (2004-08-13 16:19) [25]

2 Skyle ©  (13.08.04 15:26) [13]

А как возвращать из Update набор измененных записей для отчета, сори за тупой вопрос...


 
Ega23 ©   (2004-08-13 16:21) [26]

Select * FROM TempTable where Id=Твоё_значение
:о)

Кстати, где описание диалекта SQL для Access можно найти?


 
Квэнди ©   (2004-08-13 16:23) [27]

Вика а разве етот набор не является той самой временной таблицей?
или записи могут пересекаться? т.е. может быть такое что в временной таблице у кого- то стоит USED, и в главной таблице у етого же человека тоже USED?


 
Вика   (2004-08-13 16:25) [28]

Ну да все правильно, совсем уже зашпариласть с этими SQL"ми и Dlph"ями :)


 
Квэнди ©   (2004-08-13 16:25) [29]

Ega23 © так какого не знаю, может спросишь чтонить конкретное? может смогу помочь приходилось частенько сталкиваться.. хотя впринципе многие вопросы решаются с помощью help Access хотя я не помню есть ли там описание SQl..


 
Ega23 ©   (2004-08-13 16:32) [30]

help Access хотя я не помню есть ли там описание SQl..

Вот именно. Предположим, у меня есть скрипт на создание БД в Access (модель создал в Power Designer, там же сгенерил скрипт). Есть ли какая-нибудь внешняя утилитка, типа isql, которая этот скрипт может толкнуть?
Вообще что-нибудь про Access почитать, только не "Для того, чтобы создать связь между таблицами откройте Конструктор..."


 
46_55_41_44 ©   (2004-08-13 16:34) [31]

таксс... извините ... не было меня тут...
"клиент-сервер" это когда физически база находится на одном компе сервере, а все остальные подключаются к ней как клиенты...
MS SQL Server, Oracle, Interbase например это "клиент-сервер"ные СУБД...


 
Квэнди ©   (2004-08-13 16:35) [32]

Ega23 ©

http://narod.yandex.ru/cgi-bin/yandsearch?user=delphiworld&text=access&where=2


 
46_55_41_44 ©   (2004-08-13 16:36) [33]

А на счет примера... ничего просто в голову не приходит


 
Квэнди ©   (2004-08-13 16:37) [34]

46_55_41_44 а чем же тогда было обоснованно ваше заявление?

"Нужно делать программно... все С SQL не сделаешь.. могу помочь, если хошь..."...


 
46_55_41_44 ©   (2004-08-13 16:38) [35]

Объяснение, что такое "клиент-сервер" грубое... но думаю подойдет!


 
Ega23 ©   (2004-08-13 16:38) [36]

"клиент-сервер" это когда физически база находится на одном компе сервере, а все остальные подключаются к ней как клиенты...
MS SQL Server, Oracle, Interbase например это "клиент-сервер"ные СУБД...


Понятно...  Так вот, как правило, клиент - слабенькая дохленькая машина. Кассовый аппарат в магазине, к примеру. Или мобильный телефон. А сервер - очень мощная машина.
По-идее, всё что умеет делать клиент, это предоставить юзеру какой-то пользовательский интерфейс и формирование запросов к серверу. Сервер эти запросы вычисляет и возвращает некие наборы данных клиенту (для отображения в том самом интерфейсе). Вот и всё.


 
Erik1   (2004-08-13 16:40) [37]

В MsAccess есть очень мощный sql builder! Заходим в Access открываем базу, переходим на закладку Query, делаем New Query. Далее добавляем таблицу в поля мышкой перетаскиваем звездочку. Все наш sql готов. Его можно как StoredProc запускать из под Delphi. Access весма неплох для начинающих.


 
Ega23 ©   (2004-08-13 16:40) [38]

Объяснение, что такое "клиент-сервер" грубое

Оно неправильное. БД и клиент(ы) могут находиться физически на одной машине.


 
сергей1   (2004-08-13 16:42) [39]

еще так можно

update ConstTab set ConstTab.status = "used" where ConstTab.p_key in
(select TempTab.p_key from TempTab where TempTab.status = "used")


 
Ega23 ©   (2004-08-13 16:44) [40]

В MsAccess есть очень мощный sql builder! Заходим в Access открываем базу, переходим на закладку Query, делаем New Query. Далее добавляем таблицу в поля мышкой перетаскиваем звездочку. Все наш sql готов. Его можно как StoredProc запускать из под Delphi. Access весма неплох для начинающих.

Эта вещь View называется.

Я бы не сказал, что я начинающий. Билдер, конечно, штука хорошая, однако мне нужно описание именно ДИАЛЕКТА SQL. Со списком предоставляемых функций, переменных и т.п.

Например, в MS SQL есть такие вещи, как NoCount, @@IDENTITY, Cast/Convert. Мне нужно такое же, но для Access.


 
46_55_41_44 ©   (2004-08-13 16:44) [41]

Слушай Ega23 ©  
Это все я знаю... не первый день в этом деле...
Если хочешь выложу сюда хрень размером 3000 строк...
Там работает всего несколько запросов!!!
Но чтобы увидеть все в нормальном нужном, документированном виде, в котором требует клиент... уверяю тебя пришлось немного попотеть... и это даже не 10% проги... так что нечего иронизировать на счет моего знания или не знания технологии клиент-сервер. И не всё, что требуется это цепочка сложных запросов... просто видимо ты никогда не писал бух. приложения...


 
Ega23 ©   (2004-08-13 16:45) [42]

update ConstTab set ConstTab.status = "used" where ConstTab.p_key in
(select TempTab.p_key from TempTab where TempTab.status = "used")


На Access такое можно?


 
46_55_41_44 ©   (2004-08-13 16:46) [43]


> Ega23 ©   (13.08.04 16:44) [40]

В Access нет T-SQL


 
46_55_41_44 ©   (2004-08-13 16:47) [44]


> Ega23 ©   (13.08.04 16:45) [42]

можно


 
Ega23 ©   (2004-08-13 16:48) [45]

просто видимо ты никогда не писал бух. приложения...

Почему не писал? Писал и ещё как. Только я тебе так скажу: мне гораздо проще промежуточные вычисления запихнуть в ХП, а не тащить кучу данных на клиент и "колбасить" их там.

Представь, что вместо того, чтобы соединить тебя с аботентом, с сервера МТС пришёл пакет инструкций для самостоятельного подключения.  :о)


 
Ega23 ©   (2004-08-13 16:49) [46]

В Access нет T-SQL

Я понимаю, что его там нет. Меня интересуют АНАЛОГИ (если таковые есть). Именно об этом я и хочу почитать.


 
Квэнди ©   (2004-08-13 16:51) [47]

46_55_41_44  еще один вопрос, а как же тогда OLE, COM ?.. ето не клиент сервер? :)


 
46_55_41_44 ©   (2004-08-13 16:57) [48]

А вот это уже совсем другое!!!
очень много всего оставляется на шею сервера...
Это понятно!!!
Но не все же согласись...
но... опять таки - это еще не говорит о том, что все остальное оставляется на шею юзера... Тогда Дельфяк зачем? Весь наш спор изначально начался из-за того, что мы видимо не так друг-друга поняли... хотя говорим в целом об одном и том же!!!
Честное слово охоты нет писать здесь, чем я щас занимаюсь... но уверяю тебя только одним каким-нибудь очень сложным запросом это не выполнить...


 
46_55_41_44 ©   (2004-08-13 17:00) [49]


> Квэнди ©   (13.08.04 16:51) [47]

OLE - Object Linking and Embedding


 
Квэнди ©   (2004-08-13 17:01) [50]

46_55_41_44 а зачем одним?.. а как же процедуры и иже с ними?.. речь то идет не об решении задачей "одной строкой", а о решении задачи всеми средствами БД, а использование Делфи лишь помогает реализовать визуализацию и передачу данных...


 
AndB ©   (2004-08-13 17:10) [51]

46_55_41_44! извини, у меня с юмором напряги. Здесь
http://delphimaster.net/view/3-1092042786/ [11] > может ADOConnection - это какое-то зарезервированное слово!
и в этой ветке:
[41] > Это все я знаю... не первый день в этом деле... - это юмор?


 
Вика   (2004-08-17 13:48) [52]

Спасибо за помощь с SQL,получился вот такой запрос:

UPDATE cards SET cards.status =  " + #39 + "USED" + #39", cards.statuschange = :currDate
WHERE cards.id IN
(SELECT tmp_cards.id FROM tmp_cards WHERE tmp_cards.status = " + #39 + "USED" + #39" )
AND cards.status = " + #39 + "AVAILABLE" + #39
AND cards.statuschange IS NULL

который выполняется нормально, т.е. изменяет данные, но каждый раз выдается ошибка "List Index Out of Bounds (0)" - в чет тут может быть дело ?

Thanx...


 
46_55_41_44 ©   (2004-08-17 14:41) [53]


> AndB ©   (13.08.04 17:10) [51]

Слушай не придирайся к словам я имел ввиду может она какую-то переменную объявилаод таким названием!!!!! шутник


 
Skyle ©   (2004-08-17 14:50) [54]


> который выполняется нормально, т.е. изменяет данные, но
> каждый раз выдается ошибка "List Index Out of Bounds (0)"
> - в чет тут может быть дело ?

Код можно глянуть с указанием, где ошибка возникает.


 
Ega23 ©   (2004-08-17 14:56) [55]

List Index Out of Bounds (0)

Поди где-то стоит for i:=0 to Что-то.Count
А надо Что-то.Count-1


 
Skyle ©   (2004-08-17 15:02) [56]


> [55] Ega23 ©   (17.08.04 14:56)

Ага.

Может быть также другая ситуация (но в душе та же)
Params[1].VAlue := bla-bla
Params[2].Value := tra-tra
и т.д
То есть не с нуля, а с 1.


 
Вика   (2004-08-17 15:32) [57]

> Skyle ©
Да нет, параметр у меня там только один - текущая дата и она:

sql.Parameters.ParamByName("currDate").Value := FormatDateTime("dd.mm.yy",Date);

Ну да ладно, фиг с ним, у меня тут вопрос поважнее :))) Заранее извиняюсь если тупой (вопрос в смысле :)))

В предыдущем запросе я в основной таблице изменила статус активированных карт. Теперь мне надо узнать сколько карт этого подмножества карт (т.е. tmp_cards) относится к каким дилерам (есть таблица дилеров и в tmp_cards и в cards - соответственно поле номера дилера). Как это сделать ?


 
Skyle ©   (2004-08-17 15:37) [58]

SELECT DealerName, Count(ID)
FROM Tmp_Cards
WHERE Status = "USED"
GROUP BY DealerName

Оно?
Выдаст наименование дилера (поле DealerName) и количество записей (карт) для такого дилера в таблице tmp_cards, у которых статус "USED"
Я правильно вопрос понял?


 
Skyle ©   (2004-08-17 15:40) [59]


> номера дилера

Ну, соответственно поменять DialerName на этот номер...


 
Вика   (2004-08-17 15:44) [60]

> Skyle ©
Но имя-то дилера в таблице dillers...


 
Вика   (2004-08-17 16:55) [61]

Skyle отзовитесь плиз, помогите домохозяйке ... :))))


 
Ольга   (2004-08-18 18:52) [62]

SELECT b.DealerName, Count(a.ID)
FROM Tmp_Cards a, Dillers b
WHERE a.id_diller=b.id_diller AND a.Status = "USED"
GROUP BY b.DealerName


 
ANB   (2004-08-18 19:04) [63]


> Вика  

Все очень клево, но уточни пожалуйста задачу :
1. Что должно происходить с картами, если она использовалась раньше и перестала (то есть во временной табличке ее нет) ?
2. Если у диллера нет карточки - он должен отображаться с нулем ?
Ответишь - напишу запросы.



Страницы: 1 2 вся ветка

Текущий архив: 2004.09.12;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.048 c
8-1087911202
Chery
2004-06-22 17:33
2004.09.12
Как програмно нажать кнопку btPlay в MediaPlayer ?


10-1021529464
Олег Лаукарт
2002-05-16 10:11
2004.09.12
Многопотоковый корба-клиент (Visibroker)


4-1088021791
Teapot
2004-06-24 00:16
2004.09.12
WaitableTimer


14-1093502826
Holy
2004-08-26 10:47
2004.09.12
Страховая пенсия


3-1092383731
John
2004-08-13 11:55
2004.09.12
Получение списка источников ODBC