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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.043 c
4-1100755769
NetDigger
2004-11-18 08:29
2005.01.02
FileMon&amp;RegMon-Clones


1-1103207093
Bless
2004-12-16 17:24
2005.01.02
Что вызывается вместо inherited в данном случае?


1-1103294334
Nata
2004-12-17 17:38
2005.01.02
RXlib


14-1102704536
_UnderT_
2004-12-10 21:48
2005.01.02
Dial up server


3-1102079411
stud
2004-12-03 16:10
2005.01.02
ошибка в базе данных фб1,5