1

sqliteの2つのテーブルでUPDATEを実行したいと思います。

x1 <- data.frame(id = rep(1,3),
                  t = as.Date(c("2000-01-01","2000-01-15","2000-01-31"))
)
x1.h <- 0
x2 <- data.frame(id = 1, start = as.Date("2000-01-14"))

更新は次のとおりです。

sqldf(paste("UPDATE x1"
        ," SET x1.h = 1"
        ," WHERE EXISTS (SELECT *"
        ,"               FROM x2"
        ,"               WHERE x1.id = x2.id"
        ,"                     AND x1.t < x2.start"
        ,"               )"
        )
  )

次のエラーが発生します。

Error in sqliteExecStatement(con, statement, bind.data) : 
   RS-DBI driver: (error in statement: near ".": syntax error)

誰かが何がうまくいかないか考えていますか?助けてくれてありがとう。

4

3 に答える 3

2

なぜsqldf更新に使用するのですか? 私sqldfは声明のためだけだと思いますselect

私はこれに使用RSQLiteします。

まず、SQL ステートメントを修正します。cat できれいなリクエストを取得するには、 sep '\n' を使用することを好みます

str.update <- paste(" UPDATE x1"
            ," SET h = 1 "              ## here the error
            ," WHERE EXISTS (SELECT * "
             ,"              FROM x2 "             ## here second error 
             ,"              WHERE x1.id = x2.id "
            ,"               AND x1.t < x2.start "
            ,"       )"
      ,sep ='\n'
)


cat(str.update)
 UPDATE x1
 SET h = 1 
 WHERE EXISTS (SELECT * 
              FROM x1,x2    ##
              WHERE x1.id = x2.id 
               AND x1.t < x2.start 
       )

次に、これを行うことができます:

library(RSQLite)
con <- dbConnect(SQLite(), ":memory:")
dbWriteTable(con, "x1", x1)            # I create my table x1
dbWriteTable(con, "x2", x2)            # I create my table x2
res <- dbSendQuery(con, str.update)   
dbReadTable(con,name='x1')            ## to see the result

編集

Op の説明 (FROM x1,x2 になるFROM x2)の後に回答を編集します

于 2013-01-11T08:34:56.340 に答える
1

私はこの解決策を見つけました:

x1$h <- 0
x1 <- sqldf(c("UPDATE x1
        SET h = 1
        WHERE EXISTS (SELECT x1.id
                        FROM x2
                        WHERE x1.id = x2.id
                          AND x1.t < x2.start
                     )",
        "SELECT * FROM main.x1"))

与える:

> x1

  id          t h
1  1 2000-01-01 1
2  1 2000-01-15 0
3  1 2000-01-31 0

ソース: https://code.google.com/p/sqldf/#8._Why_am_I_having_problems_with_update ? 他に注意すべき点: 明らかにエイリアスは機能しません。たとえば、UPDATE x1 a ... 助けてくれてありがとう。

于 2013-01-11T10:14:01.330 に答える
0

あなたの内側の SELECT は、どこから選択するかを言っていないと思います。別々に試してください。私はそれがもっと似ているべきだと思った:

SELECT * FROM x1,x2 WHERE x1.id = x2.id AND x1.t < x2.start
于 2013-01-11T08:34:06.560 に答える