2

別のテーブルに行を挿入すると、あるテーブルを更新するトリガーを作成しています。この更新ステートメントでは、最初のテーブルから値を選択する必要があります。次に、この選択した値をupdateステートメントの2か所で使用する必要があります。これが私が今持っているトリガーステートメントです:

CREATE TRIGGER rsrcInsTrig AFTER INSERT ON jos_resources
FOR EACH ROW 
    UPDATE newtbl
    SET subtree_count = subtree_count + 1
    WHERE lft <= (SELECT lft FROM newtbl WHERE taxon_id = NEW.taxon_id)
    AND rgt >= (SELECT lft FROM newtbl WHERE taxon_id = NEW.taxon_id);

これは問題なく機能しますが、あまりエレガントではありません(「newtbl」はテーブルの適切な名前ではない、と言われる必要はありません。作成しませんでした)。明らかに、サブクエリを1回だけ実行し、値を保存して2回使用したいと思います。これがプログラミング言語の場合、変数を定義します。

私がやりたいことをする方法はありますか?それは本当に問題ですか(「newtbl」には150を超えるエントリがあるため、クエリは重要ではありません)。このトピックに関する他の質問は結合を使用して解決されましたが、ここでは当てはまらないと思います。

4

2 に答える 2

2
CREATE TRIGGER rsrcInsTrig AFTER INSERT ON jos_resources
FOR EACH ROW BEGIN
    DECLARE tmplft INT DEFAULT 0; -- assuming it really is an INT
    SELECT lft FROM newtbl WHERE taxon_id = NEW.taxon_id INTO tmplft;
    UPDATE newtbl
    SET subtree_count = subtree_count + 1
    WHERE lft <= tmplft
    AND rgt >= tmplft;
END
于 2012-09-12T00:08:38.437 に答える
0

WHERE 句を少し異なる方法で表現できます。

UPDATE newtbl
SET subtree_count = subtree_count + 1
WHERE (SELECT lft FROM newtbl WHERE taxon_id = NEW.taxon_id) between lft and rgt
于 2012-09-12T02:02:49.127 に答える