0

我在 Windows 上使用 PostgreSQL 9.1。

我正在自动将数据从机器收集到 PostgreSQL 数据库中,并且工作正常。数据保存在几个表中,我感兴趣的一个叫做testrecord. 我有第二个静态表调用testcode和表之间的连接。我想在其中选择一些传入数据testrecord并填充一个名为 的新表finaldata,其中有一个匹配项,parameter并且该表testid不为空(null)。

问题 1

INSERT INTO这样做是JOIN最好的方法吗?

问题2

目前所有的字段都是varchar。当我在表中添加一个整数字段finaldata(例如自动递增序列)时,我会收到诸如column "FdataID" is of type integer but expression is of type character varyingcolumn "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; 
4

1 回答 1

1

你写了:

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查询产生正确的数据,就可以在 a 中使用INSERT:-) 如果 aJOIN有助于产生正确的数据——那没关系。

于 2012-02-16T17:18:54.603 回答