如何在SQLite中使用相关子查询来更新多个列?

时间:2015-04-01 11:11:08

标签: sqlite sql-update

我想使用相关子查询更新表中的多个列。更新单个列非常简单:

UPDATE route
SET temperature = (SELECT amb_temp.temperature
                   FROM amb_temp.temperature
                   WHERE amb_temp.location = route.location)

但是,我想更新路由表的几个列。由于子查询在现实中要复杂得多(使用SpatiaLite函数加入嵌套子查询),我想避免像这样重复它:

UPDATE route
SET
  temperature = (SELECT amb_temp.temperature
                 FROM amb_temp.temperature
                 WHERE amb_temp.location = route.location),
  error = (SELECT amb_temp.error
           FROM amb_temp.temperature
           WHERE amb_temp.location = route.location),

理想情况下,SQLite会让我这样做:

UPDATE route
SET (temperature, error) = (SELECT amb_temp.temperature, amb_temp.error
                            FROM amb_temp.temperature
                            WHERE amb_temp.location = route.location)
唉,这是不可能的。这可以用另一种方式解决吗?

这是我到目前为止所考虑的内容:

  • 使用this answer中建议的INSERT OR REPLACE。似乎无法在子查询中引用路由表。
  • 使用WITH clause添加UPDATE查询,但我不认为在这种情况下有用。

为了完整起见,这是我正在处理的实际SQL查询:

UPDATE route SET (temperature, time_distance) = ( -- (C)
  SELECT  -- (B)
    temperature.Temp,
    MIN(ABS(julianday(temperature.Date_HrMn)
            - julianday(route.date_time))) AS datetime_dist
  FROM temperature
    JOIN (
      SELECT  -- (A)
        *, Distance(stations.geometry,route.geometry) AS distance
      FROM stations
      WHERE EXISTS (
        SELECT 1
        FROM temperature
        WHERE stations.USAF = temperature.USAF
              AND stations.WBAN_ID = temperature.NCDC
        LIMIT 1
      )
      GROUP BY stations.geometry
      ORDER BY distance
      LIMIT 1
  ) tmp
  ON tmp.USAF = temperature.USAF
     AND tmp.WBAN_ID = temperature.NCDC
)

此查询的高级描述:

  • 使用geometry表中的date_time(=经度和纬度)和route
  • (A)找到由美国空军和NCDC / WBAN_ID列唯一标识的气象站(stations表)
    • 最接近给定的经度/纬度(geometry
    • temperature表格中存在温度
  • (B)找到temperature表格行
    • 找到上面的气象站
    • 与给定时间戳最接近的时间
  • (C)将温度和“time_distance”存储在route

0 个答案:

没有答案