2

同じデータベース内のポリゴンレイヤー(12桁の流域識別子)から派生した属性を使用して、ポイントレイヤーの属性を挿入または更新しようとしています。つまり、これはSpatiaLite(SQLiteの空間拡張)を使用していますが、これは詳細であり、これは単にSQLの問題であるはずです。

そこで、以下の2つのトリガーを作成しました。アクションのUPDATED_ONタイムスタンプを設定する部分はうまく機能します。ただし、添付の例に示すように、空間パーツは、ポイントが発生する場所に関係なく、常に同じ値を割り当てます。1つの行からの入力で、すべての行に対して同じテストを実行しているようですが、間違った行に適用されています。したがって、トリガーのSQL内の何かが、操作を実行するために間違ったポイントを取得している必要があります。それはそのnew.rowid一部ですか?

CREATE TRIGGER INSERT_UDT_HUC12 AFTER INSERT ON mypoints
BEGIN
  UPDATE mypoints SET UPDATED_ON = DATETIME('NOW') WHERE rowid = new.rowid;
  UPDATE mypoints SET WBD_HUC12 =
              (SELECT HUC_12 FROM cumberland_huc12, mypoints
               WHERE st_intersects(mypoints.Geometry, cumberland_huc12.Geometry))
      WHERE mypoints.rowid = new.rowid;
END;

CREATE TRIGGER UPDATE_UDT_HUC12 AFTER UPDATE ON mypoints
BEGIN
  UPDATE mypoints SET UPDATED_ON = DATETIME('NOW') WHERE rowid = new.rowid;
  UPDATE mypoints SET WBD_HUC12 =
              (SELECT HUC_12 FROM cumberland_huc12, mypoints
               WHERE st_intersects(mypoints.Geometry, cumberland_huc12.Geometry))
      WHERE mypoints.rowid = new.rowid;
END 

マップの例

4

1 に答える 1

1

新しい流域識別子を返すサブクエリは次のとおりです。

SELECT HUC_12 FROM cumberland_huc12, mypoints
WHERE st_intersects(mypoints.Geometry, cumberland_huc12.Geometry)

これにより、の任意のポイントと交差するすべての流域が返されることに注意してください。したがって、トリガーは、このクエリの最初のトリガーを受け取ります。mypoints

WHERE mypoints.rowid = new.rowidサブクエリでもフィルタを使用する必要があります。

于 2012-10-17T13:58:55.143 に答える