2

この質問は私の問題を反映しています。SQLiteでこれを行う方法は?

UPDATEサブクエリ、トリガー、およびこれに似たもので自己結合を分離して、自己結合を試しまし。次に例を示します。

UPDATE stage 
SET title = 
(
  SELECT 
    prior.title
  FROM 
    stage prior,
    stage now
  WHERE 
    prior.rownum+1 = now.rownum
)
WHERE
title is null
4

2 に答える 2

4

SQLite のすべてのテーブルには、 rowidと呼ばれる疑似列があります (これらの名前が他の実際の列に割り当てられていない限り、複数の異なる名前でアクセスできます: rowidoid、 )。_rowid_行 ID 列は基本的に一意の行識別子であり、並べ替え基準や条件で使用できます。

次のクエリは、rowidを使用して問題を解決する方法を示しています。

UPDATE stage
SET title = (
  SELECT title
  FROM stage AS prev
  WHERE title IS NOT NULL AND prev.rowid < stage.rowid
  ORDER BY prev.rowid DESC
  LIMIT 1
)
WHERE title IS NULL

これは SQL Fiddleのデモです。

行 IDの詳細については、この SQLite マニュアルを参照してください。

于 2012-05-19T16:11:36.637 に答える
2

あなたが言及した問題の解決策を提示しました(SQL2008、SQLite3、およびOracle11gでテストに成功しました)。そのソリューションを以下にコピーしました。

CREATE TABLE test(mysequence INT, mynumber INT);
INSERT INTO test VALUES(1, 3);
INSERT INTO test VALUES(2, NULL);
INSERT INTO test VALUES(3, 5);
INSERT INTO test VALUES(4, NULL);
INSERT INTO test VALUES(5, NULL);
INSERT INTO test VALUES(6, 2);
SELECT t1.mysequence, t1.mynumber AS ORIGINAL
, (
    SELECT t2.mynumber
    FROM test t2
    WHERE t2.mysequence = (
        SELECT MAX(t3.mysequence)
        FROM test t3
        WHERE t3.mysequence <= t1.mysequence
        AND mynumber IS NOT NULL
       )
) AS CALCULATED
FROM test t1;

-- below here it was only tested in SQLite3, but I believe it should
-- work on other DBMS since it uses standard/non-proprietary SQL
UPDATE test
SET mynumber = (
    SELECT t2.mynumber
    FROM test t2
    WHERE t2.mysequence = (
        SELECT MAX(t3.mysequence)
        FROM test t3
        WHERE t3.mysequence <= test.mysequence
        AND mynumber IS NOT NULL
       )
);
于 2012-05-18T11:21:33.873 に答える