我在Windows上使用PostgreSQL 9.1。

我将数据从计算机自动收集到PostgreSQL DB中,这正常工作。数据被保存在几个表中,我感兴趣的数据称为 testrecord. 。我有第二个静态表称为 testcode 和桌子之间的联接。我想在 testrecord 并填充一张名为的新表格 finaldata, ,在那里有一场比赛 parametertestid 不是空白(null)。

问题1

是一个 INSERT INTOJOIN 最好的方法?

问题2

目前所有的字段都是varchar。当我在表中添加整数字段时 finaldata (例如自动递增串行)我会收到诸如 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