Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Вниз

Помогите с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.67 MB
Время: 0.035 c
3-1092375802
REP
2004-08-13 09:43
2004.09.12
Не удается записать в TBlobField произвольный файл


1-1093807149
mefisto
2004-08-29 23:19
2004.09.12
КОРОЧЕ РЕБЯТА я тот автор вопроса про кнопку ПУСК :)


3-1092489470
SDV_fox
2004-08-14 17:17
2004.09.12
Помогите найти толковую доку или обучалку по продуктам DevExpress


1-1093604352
Stanislav
2004-08-27 14:59
2004.09.12
Форма из DLL


6-1089068198
RaPToR_1
2004-07-06 02:56
2004.09.12
сокет в компоненте





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский