PostgreSQL Trigger для выбора и записи данных в новую таблицу

StackOverflow https://stackoverflow.com/questions/9310136

Вопрос

Я использую PostgreSQL 9.1 в Windows.

Я автоматически собираю данные с машины в дБ PostgreSQL, и это работает правильно. Данные сохраняются в нескольких таблицах, и мне интересно, что меня заинтересованы testrecord. Анкет У меня есть вторая статическая таблица под названием testcode и соединение между таблицами. Я хочу выбрать некоторые из входящих данных в testrecord и заполнить новую таблицу под названием finaldata, где есть совпадение на parameter и testid который не является пустым (ноль).

Вопрос 1

Является INSERT INTO а также JOIN Лучший способ сделать это?

вопрос 2

Все поля на данный момент - варчар. Когда я добавляю целочисленное поле в таблицу finaldata (например, сериал Auto Increming) Я получаю сообщения, такие как column "FdataID" is of type integer but expression is of type character varying или же column "FdataID" is of type integer but expression is of type record

Код для моей функции ниже:

INSERT INTO finaldata 
    SELECT 
        "testrecord"."Record", 
        "testrecord"."Sample", 
        "testrecord"."SampleOrig",
        "testrecord"."Parameter", 
        "testrecord"."Result", 
        "testrecord"."ResultOrig", 
        "testrecord"."Units", 
        "testrecord"."OperatorID", 
        "testrecord"."ObsTime", 
        "testrecord"."MsgTime", 
        "testcode"."Machine", 
        "testcode"."TestName", 
        "testcode"."ShortTestName", 
        "testcode"."TestID"
    FROM testrecord 
        LEFT OUTER JOIN testcode 
            ON  ("testrecord"."Parameter" = "testcode"."Parameter") 
            AND ("testrecord"."Machine" = "testcode"."Machine")
    WHERE ("testcode"."TestID") IS NOT NULL; 
Это было полезно?

Решение

Вы написали:

INSERT INTO finaldata 
    SELECT "testrecord"."Record", /* some column skipped */ 
        FROM testrecord LEFT OUTER JOIN testcode ON ("testrecord"."Parameter" = "testcode"."Parameter") AND ("testrecord"."Machine" = "testcode"."Machine")
        WHERE ("testcode"."TestID") IS NOT NULL; 

Первое: в каких столбцах будут INSERT Напишите материал, созданный SELECT часть? Вы должны указать это так:

INSERT INTO finaldata ("Record", ...)
    SELECT "testrecord"."Record", /* some column skipped */ 
    ...

Ваше странное послание о неправильных типах может быть вызвано этим.

Второе:

... WHERE ("testcode"."TestID") IS NOT NULL; 

Любое вы подразумеваете, что хотите использовать этот код внутри функции (я думаю, функция триггера). Каждый звонок к этому утверждению не просто вставит одну новую строку в finaldata, это вставит все. Анкет Дублирующие записи - это определенная вещь.

Так:

  • Исправить INSERT часть
  • Исправить недостающий квалификатор в SELECT часть.

О, да, вопрос один: до тех пор, пока SELECT Запрос дает правильные данные, он достаточно хорош для использования в рамках INSERT :-) Если JOIN Помогает создать правильные данные - это нормально.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top