3

mysql(5.1.36) での完全結合について多くの質問があります。もちろん、解決策は結合と結合の組み合わせです。

私の問題は、次のような 2 つの一時テーブルがあることです。

CREATE TEMPORARY TABLE wConfs
(
    idWorker INT,
    confs SMALLINT
) ENGINE=INNODB;

CREATE TEMPORARY TABLE wRejects
(
    idWorker INT,
    rejects SMALLINT
) ENGINE=INNODB;

JOIN-UNION mix は一時テーブルの完全結合には使用できませんERROR 1137 (HY000): Can't reopen table

私の質問は、一時テーブルで完全結合を実現するための最高のパフォーマンスを備えた最も簡単なソリューションは何ですか?

編集:JOIN-UNIONミックス:

SELECT wc.idWorker, wc.confs, wr.rejects FROM wConfs wc LEFT JOIN wRejects wr 
ON (wr.idWorker = wc.idWorker)
UNION
SELECT wc.idWorker, wc.confs, wr.rejects FROM wConfs wc RIGHT JOIN wRejects wr 
ON (wr.idWorker = wc.idWorker);
4

2 に答える 2

5

2 つのテーブルから異なる値を持つ 3 番目の一時テーブルを作成してidWorkerから、JOIN-UNION ミックスで使用してみてください。

CREATE TEMPORARY TABLE all_id
  SELECT idWorker FROM wConfs UNION SELECT idWorker FROM wRejects;

SELECT t.idWorker, c.confs, r.rejects FROM all_id t
LEFT JOIN wConfs c
  ON t.idWorker = c.idWorker
LEFT JOIN wRejects r
  ON t.idWorker = r.idWorker;
于 2012-06-12T09:47:31.927 に答える
1

私はそれを解決する別の方法を見つけました。3番目の一時テーブルも作成しました:

DROP TABLE IF EXISTS wResults;
CREATE TEMPORARY TABLE wResults
(
    idWorker INT PRIMARY KEY,
    rejects SMALLINT,
    confs SMALLINT
) ENGINE=INNODB;

今、私はそのように行を挿入します:

INSERT INTO wResults(idWorker, confs)
    SELECT idWorker, confs FROM wConfs;

INSERT INTO wResults(idWorker, rejects)
    SELECT wr.idWorker, wr.rejects FROM wRejects wr
    ON DUPLICATE KEY UPDATE rejects = wr.rejects;

それは魅力のように機能します。挿入するデータがたくさんあると、かなり遅くなると思いますが、私のテーブルはかなり小さいです。とにかくありがとうございました!

于 2012-06-12T10:14:41.200 に答える