4

私はたくさんの例を検索して見つけましたが、それでもこの作業を行うのに苦労しています。

SQLiteには次のテーブルがあります。

SELECT * FROM TableA;

ID|USER|NAME|PARENT
1|User1|SomeName|-1
2|User1|SomeOtherName|1
3|User2|SomeName|-1
4|User2|SomeOtherName|-1

SomeOtherNameのNAMEを持つID2の親はID1-これは正しいです。

SomeOtherNameの名前を持つID4の親はID-1-これは正しくありません。ID3である必要があります。

そのような誤ったレコードがたくさんあります(すべて同じNAMEがSomeOtherNameで、PARENTが-1です)。

それらを結び付ける列はUSERです。

間違ったすべてのレコードを正しい親IDで更新する必要があります。

私は無駄に次のことを試みました:

DROP TABLE orphans;

CREATE TEMP TABLE orphans as
    SELECT TableA.id, TableA.user, TableA.name FROM TableA WHERE TableA.name = 'SomeOtherName' AND TableA.parent = -1;

UPDATE TableA
SET parent = (  SELECT TableA.id
                        FROM TableA
                        INNER JOIN orphans
                        ON TableA.name = 'SomeName' AND orphans.user = TableA.user
                )
WHERE TableA.user IN (  SELECT TableA.user
                                FROM TableA WHERE TableA.name = 'SomeOtherName' AND TableA.parent = -1 )
;

私はそれを正しく理解できないようです。どんな助けでもありがたいです。

4

2 に答える 2

2

私が知る限り、sqliteはステートメント内の複雑なクエリに対して非常に限られた機能しか持っていません。UPDATE複数のテーブルを使用することはできません。また、サブクエリ内から現在の行の値を参照する方法が見つかりませんでした。

代わりに私はこれを思いついた:

SELECT id, user, name,
  CASE name = 'SomeOtherName' AND parent = -1
  WHEN 1 THEN (
    SELECT MAX(id)
    FROM TableA A2
    WHERE A1.user = A2.user
    AND A2.name != 'SomeOtherName'
  ) ELSE parent END AS parent
FROM TableA A1;

これはあなたが望むデータでなければなりませんよね?これを一時テーブルに書き込んで、そこから元のテーブルにデータをフィードバックすることができます。このフィードバックREPLACEは、一意のキーがある場合はを使用して、そうでない場合はDETELTEその後に続くを使用して実行できINSERTます。後者の例をsqlfiddleで作成しました。

于 2012-08-09T13:24:26.030 に答える
1

もちろん遅い返事ですが、これは臨時雇用者のテーブルなしで達成できると私は信じています。selectを適切な方法で使用するだけです。以下のコードは、同様の表で機能します。

UPDATE TableA SET PARENT = (
            SELECT ID
            FROM TableA AS T
            WHERE T.NAME = 'SomeName' AND T.USER = TableA.USER
        )
WHERE ID IN (
            SELECT ID
            FROM TableA
            WHERE TableA.NAME = 'SomeOtherName' AND TableA.PARENT = -1
            );
于 2015-03-18T09:35:17.003 に答える