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,不能使用CTE。 如果我使用联合/子查询,Im获取不能重用表错误。 有没有一种方法可以在没有临时桌子的情况下实现这一点?
请帮帮我。
您可以插入每个别名的代码。 。。。一直这样做,直到你站在基台:
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
添加额外的键,以确保排序是稳定的(即每次返回相同的结果,因为键的组合是唯一的)。