Страница 1 из 1

какОтсортироватьДанныеИзДвухПохожихТаблиц В одном запросе?

Добавлено: 07 янв 2005, 03:26
Alexander
здравствуйте! вот моя история:
/*********************************************************/
есть две таблицы

1- документы
2- архив документов будет содержать миллионы записей накопленные допустим в течении 10 лет! предполагаемый размер каждой записи не будет превышать 10кБ

данные по истечении некоторого времени полностью перемещаються в таблицу 2, т.о. в таблице 1 только свежие доки.

каждая из этих таблиц имеет связь с таблицей типов документов. Типов документов будет не более 15.
/*********************************************************/

вот сам вопрос:

как лучше (правильнее) всего выбрать доки из обоих таблиц и при этом отсортировать их по любому из необходимых полей, так что бы набор результирующих строк был как-будто бы все данные были выбраны из одной таблицы.
Другими словами что-то вроде выбрать данные из т.1 поместить в т.3(временную) потом выбрать из т.2 поместить тоже в т.3 и потом уже выбрать из этой т.3 только отсортированными.

Предложенный мною вариант вродьбы "ничего", но я думаю что существует намного интересней, тем более что записей у меня будет много и они будут приличного размера не займет ли это много времени, мне кажеться, что, не стоит их копировать во временную таблицу... :shock:
telemaster@mail.ru

Добавлено: 07 янв 2005, 12:56
Klyk
Просто как вариант в голову пришло. Может быть поможет.

Код: Выделить всё

CREATE PROCEDURE MyPROCEDURE
RETURNS (
    A INTEGER,
    B INTEGER)
AS
begin
for
SELECT ARHDOC.IDDOC,
        DOCS.IDDOC,
        DOCS.OtherField
FROM DOCS
   INNER JOIN ARHDOC ON (DOCS.ID_DOC = DOCS.ID_DOC)
   into
    :a,
    :a,
    :b
do
begin

  suspend;
  end
end

Добавлено: 07 янв 2005, 13:53
Klyk
или, вот для твоего случая больше подойдёт

Код: Выделить всё

CREATE PROCEDURE NMYPROC 
RETURNS (
 RESFIELD1 INTEGER,
 RESFIELD2 INTEGER,
 RESFIELD3 INTEGER)

AS
begin
 for
  select
   table1.field1,
   table1.field2,
   table1.field3
  from table1
  into
   :ResField1,
   :ResField2,
   :ResField3
do
  suspend;
for
 select
 table2.field1,
 table2.field2,
 table2.field3
from table2
into
 :ResField1,
 :ResField2,
 :ResField3
do
  suspend;
end

а потом
что-нить вроде

Код: Выделить всё

select * from NMYPROC  order by  NMYPROC.resfield3 desc rows(2)
Мдя...
Хватит праздники праздниковать

Всех поздравляю!!!

OFFTOP: Смайлика с кружкой пива не хватает :))

Добавлено: 07 янв 2005, 21:50
sag
Вариантов можно напридумывать разных: union all (который еще и
во view можно завернуть), хп.
Интересней, на мой взгляд, хранить всё (и документы и архив) в
одной таблице и не париться с выборками.

Добавлено: 10 янв 2005, 04:53
Alexander
Klyk писал(а):

Код: Выделить всё

select * from NMYPROC  order by  NMYPROC.resfield3 desc rows(2)
Спасибо! Очень помог! Век не забуду!!! :) :) :)

Только так и не узнал зачем нужен этот "rows(2)"? У меня и без него работает прекрасно

Добавлено: 10 янв 2005, 05:03
Klyk
Только так и не узнал зачем нужен этот "rows(2)"? У меня и без него работает прекрасно
И должно работать без него. Только результат разный :)