mysql-子查询问题-无法重用表

ffvjumwh  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(285)
WITH t as (
SELECT *
            FROM scd p
            WHERE  p.modified_date > FROM_UNIXTIME(1593060230)
                AND ( p.main_id = 1
                OR FIND_IN_SET(1, p.mult_ids) <> 0 )
            ORDER BY modified_date DESC
            LIMIT 2 OFFSET 0
),
del as (
SELECT 

* 

FROM t WHERE (status <> 1 AND status <> 2)
),
w_del as (
SELECT 

* 

FROM t WHERE (status = 1 OR status = 2)
)
SELECT w_del.*, del.* FROM w_del,del;

如何使用普通子查询实现这一点。我使用的是MySQL5.7,不能使用ctes。如果我使用联合/子查询,则无法重用表错误。有没有一种方法可以在没有临时表的情况下实现这一点?
请帮忙。

erhoui1w

erhoui1w1#

您只需为每个别名插入代码。继续这样做,直到你在基表上:

SELECT w_del.*, del.*
FROM (SELECT t.*
      FROM (SELECT *
            FROM scd p
            WHERE p.modified_date > FROM_UNIXTIME(1593060230) AND
                  ( p.main_id = 1 OR FIND_IN_SET(1, p.mult_ids) <> 0 )
            ORDER BY modified_date DESC
            LIMIT 2 OFFSET 0
           ) t
       WHERE (status <> 1 AND status <> 2)
      ) w_del CROSS JOIN
     (SELECT t.*
      FROM (SELECT *
            FROM scd p
            WHERE p.modified_date > FROM_UNIXTIME(1593060230) AND
                  ( p.main_id = 1 OR FIND_IN_SET(1, p.mult_ids) <> 0 )
            ORDER BY modified_date DESC
            LIMIT 2 OFFSET 0
           ) t
       WHERE (status = 1 OR status = 2)
      ) del;

不过,有一个关键点:定义 t 正在使用 ORDER BY 以及 LIMIT . 如果有领带 modified_date 列,则两个子查询可以返回不同的结果集。您有两种选择来避免出现问题:
将其他键添加到 ORDER BY 以确保排序是稳定的(即每次返回相同的结果,因为键的组合是唯一的)。
使用临时表具体化子查询。

相关问题