MySQL全外连接临时表

3

很多人对mysql(5.1.36)的全连接(join)提出了很多问题。当然,解决方案是使用连接联合(join-union)。

我的问题是,我有两个像这样的临时表(temporary tables)

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

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

使用JOIN-UNION混合语句无法用于全连接临时表,因为会导致错误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);

这个“JOIN-UNION混合”的代码在哪里? - ypercubeᵀᴹ
将这个混合内容添加到我的问题中。 - Joe
2个回答

5
尝试创建第三个临时表,其中包含来自两个表的不同的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;

结果表有些尴尬,它包含以下列 | idWorker | idWorker | confs | idWorker | rejects | - Joe
这不是问题。请指定您需要的字段,而不是使用“*”。我已经更改了答案。 - Devart
它拥有我需要的所有字段,甚至更多;) 它应该只有一个“idWorker”列。 - Joe
在SELECT列表中指定你需要的字段。 - Devart
昨天没有注意到你编辑了这个。抱歉。谢谢你的回答。 - Joe

1
我找到了另一种解决方法。我还创建了第三个临时表:
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;

它的运作非常顺畅。我猜如果需要插入大量数据,速度会比较慢,但我的表格相当小。 无论如何,谢谢大家!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接