Текущий архив: 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.5 MB
Время: 0.027 c