【问题标题】:Mysql Full Outer Join Temporary TablesMysql全外连接临时表
【发布时间】:2012-06-12 09:04:14
【问题描述】:

mysql(5.1.36)中关于full-joining的问题很多。当然解决方案是join-union组合。

我的问题是我有两个像这样的临时表

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);

【问题讨论】:

  • 这个“JOIN-UNION mix”的代码在哪里?
  • 将此组合添加到我的问题中。

标签: mysql join temp-tables


【解决方案1】:

尝试从两个表中创建具有不同 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 |
  • 这不是问题。指定您需要的字段而不是“*”。我已经改变了答案。
  • 它包含我需要的所有字段,甚至更多;) 它应该只有一个 idWorker 列。
  • 在 SELECT 列表中指定您需要的字段。
  • 没注意到你昨天编辑了这个。对不起。谢谢你的答案。
【解决方案2】:

我找到了另一种解决方法。我还创建了第三个临时表:

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;

它就像一个魅力。我想如果要插入很多数据 - 它会很慢,但我的表很小。 还是谢谢大家!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    相关资源
    最近更新 更多