2016-03-25 9 views
1

私は何年ものPostgreSQLに甘んじており、sqliteの限定updateの構文には苦労しています。私は働いている質問を一緒に綴じましたが、私は誰かがより良い方法を知っていることを望んでいます。 (これは非常に見栄えがよくなく、sqliteがエラーメッセージを案内する製品です)。sqlite:Join Tableからmax()を使用してTableAを更新する

シナリオ:

私は、標準のアソシエーションテーブルの設定があります:A、A2B、B

を私が "最新" に対応するB(BはA2B協会を介して接合されてAにすべてのレコードを更新したいですテーブルにあり、「最新」はB列のmax関数です)。

-- works 
UPDATE t_a 
SET id_latest_b = (
    SELECT id_b FROM (
     SELECT t_b.id as id_b, 
       max(t_b.timestamp_event), 
       t_a2b.id_a 
       FROM t_b 
       JOIN t_a2b 
        ON (t_b.id = t_a2b.id_b) 
       GROUP BY t_a2b.id_a 
    ) q_inner 
    WHERE 
    t_a.id = q_inner.id_a 
); 

-- test data 
CREATE TABLE t_b (id INT PRIMARY KEY, timestamp_event INT); 
CREATE TABLE t_a (id INT PRIMARY KEY, id_latest_b INT REFERENCES t_b(id)); 
CREATE TABLE t_a2b (id_a REFERENCES t_a(id), id_b REFERENCES t_b(id), PRIMARY KEY (id_a, id_b)); 
INSERT INTO t_a VALUES (1, NULL); 
INSERT INTO t_a VALUES (2, NULL); 
INSERT INTO t_a VALUES (3, NULL); 
INSERT INTO t_a VALUES (4, NULL); 
INSERT INTO t_b VALUES (1, 10); 
INSERT INTO t_b VALUES (2, 20); 
INSERT INTO t_b VALUES (3, 30); 
INSERT INTO t_a2b VALUES (1, 1); 
INSERT INTO t_a2b VALUES (1, 2); 
INSERT INTO t_a2b VALUES (2, 2); 
INSERT INTO t_a2b VALUES (3, 1); 
INSERT INTO t_a2b VALUES (3, 2); 
INSERT INTO t_a2b VALUES (3, 3); 
INSERT INTO t_a2b VALUES (4, 1); 
INSERT INTO t_a2b VALUES (4, 4); 

答えて

1

あなたは、最大値を持つ行を取得するにはORDER BYを使用することができます。

UPDATE t_a 
SET id_latest_b = (SELECT t_b.id 
        FROM t_b 
        JOIN t_a2b ON t_b.id = t_a2b.id_b 
        WHERE t_a2b.id_a = t_a.id 
        ORDER BY t_b.timestamp_event DESC 
        LIMIT 1); 
+0

見てだけの方法よりよいです! –

関連する問題