【问题标题】:2 temp table mysql using union2 使用联合的临时表mysql
【发布时间】:2018-10-12 06:57:13
【问题描述】:

我已经创建了 2 个临时表并尝试对这 2 个表执行联合命令,但我发现了一条错误消息: 错误代码:1137 无法重新打开表格:“库存” 以下是我提出的查询:

DROP TABLE IF EXISTS stok;
DROP TABLE IF EXISTS bdp;
CREATE TEMPORARY TABLE stok AS(SELECT * from productA);

CREATE TEMPORARY TABLE bdp AS(SELECT * from quantity);

SELECT AllSubs.kode, stok.stok,bdp.qty FROM
(SELECT kode FROM stok
UNION
SELECT kode FROM bdp) AS AllSubs
LEFT JOIN stok ON stok.kode = AllSubs.kode
LEFT JOIN bdp ON bdp.kode = AllSubs.kode
GROUP BY AllSubs.kode

正如我上面提到的,这个查询出现了一条错误消息: 错误代码:1137 无法重新打开表:'stok'

请帮忙,谢谢

【问题讨论】:

    标签: mysql


    【解决方案1】:

    来自documentation

    您不能在同一查询中多次引用 TEMPORARY 表。

    上述链接中给出的使用 CTE 的解决方法,即这样做:

    WITH stok AS (
        SELECT * from productA
    ),
    bdp AS (
        SELECT * from quantity
    )
    -- your query here
    

    但这需要 MySQL 8+ 或更高版本。如果您使用的是早期版本,那么您可以尝试在两个临时表后面内联查询。或者,您可以创建非临时真实表并使用它们。

    【讨论】:

      【解决方案2】:

      您不能多次引用临时表,因此您应该将查询重写为

      SELECT distinct AllSubs.kode
              , productA.stok
              , quantity.qty 
      FROM  (
          SELECT kode FROM productA
          UNION
          SELECT kode FROM quantity
      ) AS AllSubs
      LEFT JOIN productA ON productA.kode = AllSubs.kode
      LEFT JOIN quantity ON bdp.kode = AllSubs.kode
      

      并且您没有使用聚合函数,那么您不应该使用 group by .. 最终使用 distinct 来避免行重复。

      在最新版本的mysql中不允许使用group by来表示没有聚合函数的未聚合列

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多