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

Вниз

Подскажите как в ХРАНИМОЙ ПРОЦЕДУРЕ выбрать уникальные записи?   Найти похожие ветки 

 
Ivanesus   (2004-12-03 10:15) [0]

Осваиваю работу с процедурами в Interbase, есть вопрос – Что дописать в процедуру или как ее переписать, чтобы выходной параметр PARAM_01 собравший из двух столбцов ELEM_P1, ELEM_P2 таблицы "T_Table" уникальные записи, выдал бы уникальные записи этих столбцов, а не их объединение?
SET TERM ^ ;
CREATE PROCEDURE MY_PROC
RETURNS (PARAM_01 VARCHAR(18))
AS
DECLARE VARIABLE VAR_02 VARCHAR(18);
DECLARE VARIABLE VAR_01 VARCHAR(18);
begin
 for  select DISTINCT ELEM_P1 from "T_Table"   into :Var_01
 do   begin      param_01=var_01;      suspend;     end
 for  select DISTINCT ELEM_P2 from "T_ Table"   into :Var_02
 do   begin      param_01=var_02;      suspend;     end
end
^
SET TERM ; ^
Заранее, спасибо за помощь.


 
Johnmen ©   (2004-12-03 10:22) [1]

UNION


 
Ivanesus   (2004-12-03 11:36) [2]

Привожу ЗАПРОС который меня устроил (в плане полученного результата), возможно кому нибудь, когда нибудь пригодиться для освоения данной темы.
SET TERM ^ ;
CREATE PROCEDURE MY_PROC
RETURNS (PARAM_01 VARCHAR(18))
AS
DECLARE VARIABLE VAR_01 VARCHAR(18);
begin
  for
  select ELEM_P1 from "T_Table"
  union
  select ELEM_P2 from "T_Table" into :Var_01
  do
   begin
    param_01=var_01;
    suspend;
   end
end
^
SET TERM ; ^
Спасибо Johnmen за подсказку! Если у кого будут еще варианты решения = присылайте, будет интерестно.


 
Johnmen ©   (2004-12-03 11:41) [3]

Будь проще :)
Убрать Var_01
... into :param_01


 
ЮЮ ©   (2004-12-03 11:43) [4]

>Если у кого будут еще варианты решения

Лучшек объяви конкурс: Кто предложит формулировку проблемы, которую можно решить таким способом?

Я, например, совсем не понимаю, как и зачем в одну переменную помещать значение поля как минимум двух записей? И IB6.x не ругается?


 
Ivanesus   (2004-12-03 11:46) [5]

Точно, как то сразу и не сообразил!
SET TERM ^ ;
CREATE PROCEDURE MY_PROC
RETURNS (PARAM_01 VARCHAR(18))
AS
begin
 for
 select ELEM_P1 from "T_Table"
 union
 select ELEM_P2 from "T_Table" into :param_01
 do
  begin
   suspend;
  end
end
^
SET TERM ; ^


 
ЮЮ ©   (2004-12-03 11:53) [6]

Так что он вернёт в PARAM_01, если в ELEM_P1 и ELEM_P2 встретится хотябы 2 разных значения на всю таблицу? Или это совсем не важно?


 
Johnmen ©   (2004-12-03 11:58) [7]

>Ivanesus   (03.12.04 11:46) [5]

Ещё сократить :)
Вместо
 begin

 end

просто
 suspend

PS А зачем такая процедура нужна ?

>ЮЮ ©   (03.12.04 11:53) [6]

Не совсем понятно, про что ?


 
Ivanesus   (2004-12-03 12:12) [8]

Объясню зачем нужно было:
Пишу базу хранящую данные по Химическим реакциям. Каждое хим.вещество находиться в своем столбце ELEM_Px таблицы "T_Table" содержащей записи вида:
H2+O2=H2O+O
H2+O=H2O
H+O=OH
...........
C2H2+OH=CH2CO+H      
и т.д. и т.п.
/T_Table/
====================================
|ELEM_Px|ELEM_Px|ELEM_Px|ELEM_Px|...
------------------------------------
|H2     |O2     |H2O    |O      |...
|H2     |O      |H2O    |       |...
|H      |O      |OH     |       |...
|C2H2   |OH     |CH2CO  |H      |...
|...................................
А цель ЗАПРОСА определить сколько всего уникальных хим.веществ участвует в тысячах рекций, ведь вещества повторяются в разных местах хим.реакций (как реагент, как продукт, стоит первым или n-ным, и т.п.)


 
ЮЮ ©   (2004-12-03 12:18) [9]

>Не совсем понятно, про что ?

Да это просто домой пора :) Замучили со своим IB :) я почему то полагал, что это - процедура, возвращающая (в качестве выходного параметра) - переменную типа VarChar(18), а не целый набор данных.


 
Johnmen ©   (2004-12-03 12:37) [10]

>Ivanesus   (03.12.04 12:12) [8]

С запросом понятно. Я не понял, зачем процедура для этого...


 
Ivanesus   (2004-12-03 12:50) [11]

Для    
>ЮЮ © (03.12.04 11:53) [6]
Если в качестве примера взять "объяснение": >Ivanesus   (03.12.04 12:12) [8]
и учесть что в таблице "T_Table" всего 4 указанных реакции, то запрос выдаст "приблизительно"(неуверен что отсортирует именно так) следующее:
|=========
H2
O2
H2O
O
H
OH
C2H2
CH2CO
|=========
всего 8 строк(уникальных веществ) из возможных 14(общего колличества веществ в реакциях)


 
Ivanesus   (2004-12-03 13:20) [12]

>Johnmen ©   (03.12.04 12:37) [10]
у меня есть еще таблица, для простоты назовем ее "TD_Table", в ней содержится полный список всех хим.веществ и всякие к ним данные. Программа, запрашивая определенную выборку из таблицы с реакциями "T_Table" должна получить еще и определенные данные из строк в таблице "TD_Table". Вот над этим я в данный момент и бьюсь. Если есть предложения как это проще реализовать буду благодарен.
Цель такая:
По запросу к "T_Table" формируются данные по реакциям необходимые к выгрузке в *.txt формат, далее, аналог вышеприведенной процедуры MY_PROC выбирает уникальные вещества в реакциях(пока все что есть) и надо сравнить этот набор (PARAM_01), с имеющимися веществами в "TD_Table", и совпавшие также выгрузить в *.txt
С выгрузкой проблем нет, главное правильно сформировать запрос.
Текущие вопросы:
1) Можно ли умудриться сформировать такой запрос в одной процедуре? (Думаю ДА, но пока незнаю как).
2) Если использовать две процедуры, то является ли PARAM_01 из MY_PROC глобальным для всей базы данных, или он только выводит данные, а другая процедура не сможет их запросить. (Думаю что запросить их как то можно, но пока незнаю как)


 
Johnmen ©   (2004-12-03 13:26) [13]

>Ivanesus   (03.12.04 13:20) [12]

Формализуй свой вопрос. Т.е. что есть (пример данных), что надо получить (пример данных).
По
1. Ещё раз - зачем тебе процедура для простого выполнения одного запроса ?
2. Нет конечно !!! Только выводит. Сможет запросить.

ibase.ru в помощь.


 
Ivanesus   (2004-12-03 14:38) [14]

Есть Две таблицы с данными:
"T_Table" - таблица с k реакциями
ID."T_Table"  - первичный ключ
|==========================================
| ID | Elem_P1 | Elem_ID |...| Elem_Pn |...
|------------------------------------------
| 1  | H2O     |    33   |...
|...
| k  | ...
|------------------------------------------
"TD_Table" - таблица с kk веществами
Elem_ID."TD_Table" - первичный ключ
|===================================================
| Elem_ID | ELEM_NAME | Koeff_01 |...| Koeff_nn |...
|---------------------------------------------------
| 1       |    H2     | 1.2E+001 |...
|...
| 33      |    H2O    | 3.4E-003 |...
|...
| kk      |   ...
|---------------------------------------------------
В ПРОГЕ, Пользователь делает запрос:
IBDataSet_T_Table.SQL("select * from "T_Table" where (???=???)");
Остается необходимый набор реакций которые надо выгрузить
while not IBDataSet_T_Table.eof do WriteLn(inFile_T,Elem_P1,...,Elem_Pn);
но при этом надо еще выгрузить и данные из IBDataSet_TD_Table
while not IBDataSet_TD_Table.eof do WriteLn(inFile_TD,ELEM_NAME,Koeff_01,...,Koeff_nn);
а вот запрос должен быть(как мне думается) такого рода:
IBDataSet_TD_Table.SQL
(
"select * from "TD_Table"
 where ELEM_NAME."TD_Table"=select PARAM_01 from MY_PROC"
);
MY_PROC = PROCEDURE MY_PROC RETURNS (PARAM_01 VARCHAR(18)) см.выше >Ivanesus (03.12.04 11:46) [5]

Не знаю на сколько такой ЗАПРОС правомочен. Подскажите, может есть другое решение?


 
Johnmen ©   (2004-12-03 14:46) [15]

Осваивай SQL. JOIN. Процедура здесь явно неуместна...:)


 
Ivanesus   (2004-12-03 14:57) [16]

Спасибо за очередной намек, но немогбы ты написать, хотябы схемотично, как это будет выглядеть в решаемой мной задачке?


 
Johnmen ©   (2004-12-03 15:01) [17]

SELECT * FROM Table1
[LEFT|RIGHT] JOIN Table2 ON <join-condition>
[LEFT|RIGHT] JOIN Table3 ON <join-condition>
...


 
Ivanesus   (2004-12-03 18:03) [18]

Спасибо >Johnmen ©   (03.12.04 14:46) [15]
задачка решилась комбинацией
SELECT
JOIN
UNION
.....
и чтобы окончательно все ришить осталась последняя тема для освоения: ПОДЗАПРОСЫ (может конечно неправильно выразился).
Суть в следующем:
Как сделать следующее:
Выполнить IBDataSet.SelectSQL("*"); к базе, а затем выполнить другой запрос к этому, больше не обращаясь к базе? Что это должен быть за запрос? В какую сторону знаний мне "рыть"?



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

Форум: "Базы";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.037 c
8-1096632935
Lex_asd
2004-10-01 16:15
2005.01.02
Как проиграть Wav файл (фоновая музыка)


14-1103096921
NewDelpher
2004-12-15 10:48
2005.01.02
Недостатки 1С Предприятие версии 8


9-1093556347
Froll
2004-08-27 01:39
2005.01.02
X-files


1-1103143375
Shnabs
2004-12-15 23:42
2005.01.02
Графика


8-1096567161
suharew
2004-09-30 21:59
2005.01.02
Как сделать уменьшенный вариант фотки??





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский