0

私は2つのテーブルを持っています:

stock:

pid name qty
--- ---- ---
1   aaaa   2
2   bbbb   3
1   aaaa   5
3   cccc   1
2   bbbb   2

stock_total:

pid name total_qty
--- ---- ---------

このクエリstockを使用して、合計数量のテーブルから行を挿入できますstock_total

INSERT INTO stock_total (pid, name, total_qty)
SELECT pid, name, SUM(qty) 
FROM stock
GROUP BY pid, name

問題は、上記のSQLをcronジョブで実行することです。したがって、次の実行時に、SQLは既存の製品を更新し、存在しない製品を挿入する必要があります。

SELECTの結果をループし、各行が存在するかどうかを確認stock_totalして、INSERTまたはUPDATEを実行すると、非常に非効率になります。

これを達成するためのより簡単な方法はありますか?おそらく上記のSQLを変更することによって。ありがとう。

4

5 に答える 5

1

使用DUPLICATE KEY UPDATE

INSERT INTO TABLENAME(col1, col2)
VALUES (@value, ‘yyy’)
ON DUPLICATE KEY UPDATE col1 = @value
于 2012-05-24T08:22:02.080 に答える
1

これは更新用です:

UPDATE stock_total
SET total_qty = SUM(s.qty)
FROM stock_total st
INNER JOIN stock s
ON st.pid = s.pid
AND st.name = s.name
WHERE s.pid = st.pid
GROUP BY s.pid

そしてこれは挿入のために:

INSERT INTO stock_total
SELECT s.pid, s.name, SUM(s.qty)
FROM stock s
WHERE s.pid NOT IN (SELECT pid FROM stock_total)
GROUP BY s.pid, s.name

大丈夫なはずです、試してみてください。

于 2012-05-24T08:23:33.110 に答える
0

なぜあなたは仕事からストアドプロシージャを呼び出さないのですか?

DUPLICATE KEYブロック内のSPで、例外とをキャッチしますUPDATE。スローされない場合EXCEPTIONはスローされますINSERT

于 2012-05-24T08:24:08.977 に答える
0

mergeあなたが探しているものです。次のように使用してください-

merge into stock_total s " +
                        "using (select ? pid, ? name, ? total_qty from dual) d " +
                        "on (s.pid = d.pid and s.name = d.name and s.total_qty = d.total_qty) " +
                        "when matched then " +
                        "update set s.pid= d.pid, s.name = d.name, s.total_qty = d.total_qty" +
                        "when not matched then " +
                        "insert (pid, name, total_qty) " + 
                        "values(d.pid, d.name, d.total_qty)" ;

編集(mySQLの場合):

MERGE INTO table_name WITH (HOLDLOCK) USING table_name ON (condition)
WHEN MATCHED THEN UPDATE SET column1 = value1 [, column2 = value2 ...]
WHEN NOT MATCHED THEN INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...])
于 2012-05-24T08:25:20.577 に答える
0

ここでいくつかのグーグルと答えを試した後、私はこの解決策を思いつきました。MySQLがとをサポートしていることがわかりましREPLACE INTO......ON DUPLICATE KEY UPDATE。したがって、私のクエリは次のようになります。

REPLACE INTO stock_total
SELECT pid, name, SUM(qty)
FROM stock
GROUP by pid, name

また、

INSERT INTO stock_total
SELECT pid, name, SUM(qty)
FROM stock
GROUP by pid, name
ON DUPLICATE KEY UPDATE total_qty=VALUES(total_qty)

に行が存在する場合stock_total、最初のクエリは新しい行をDELETEしてからINSERTし、2番目のクエリは既存の行を更新します。

両方のクエリは、テーブルに主キーまたは一意のインデックスがある場合にのみ機能します。

CREATE TABLE stock_total (
    pid         INT         NOT NULL,
    name        VARCHAR(20) NOT NULL,
    total_qty   INT         NOT NULL,

    UNIQUE (pid, name)
);

ドキュメンテーション:

于 2012-05-24T12:16:02.050 に答える