试图解决缺乏 CTE

Trying to get around lack of CTE

我在过滤较长查询的结果时遇到了一些问题。

假设我们有三列,其中有一些示例行:

# column_1, column_2, column_3

'value 1', 'value 2', null
'value 1', 'value 2', '2'
'value 2', 'value 2', null

我想 select 所有行,但不包括 column_3 为空且其 column_1、column_2 值与至少一个非空 column_3 值。

一个痛点是我坚持使用 MySQL 5.7,这些行是由一个相当长的文本子查询生成的。如果我有 CTE,我可以做:

WITH 
    cte1 AS (...)
SELECT *
FROM cte1 as a
WHERE
    column_3 IS NOT NULL
    OR NOT EXISTS (
        SELECT 1
        FROM cte1 as b
        WHERE
            b.column_1 = a.column_1
            AND b.column_2 = a.column_2
            AND b.column_3 IS NOT NULL
    )

鉴于我无权访问 CTE,有没有什么方法可以在不复制粘贴大型子查询的情况下执行此操作?

无论有没有 CTE,您都需要复制粘贴大型子查询。将是:

with a as (subquery)
select *
from a
where ...

没有更短:

select *
from (subquery) as a
where ...

如果您在 MySQL 中没有 CTE,5.x 另一种选择是使用子查询创建视图。

然后您可以在主查询中多次使用该视图。这是 CTE 的糟糕替代品,可能会遇到一些限制和性能问题,但仍然可以解决问题。

create view v1 as select ...;

然后,您的主要查询几乎保持不变:

SELECT *
FROM v1 as a
WHERE
    column_3 IS NOT NULL
    OR NOT EXISTS (
        SELECT 1
        FROM v1 as b
        WHERE
            b.column_1 = a.column_1
            AND b.column_2 = a.column_2
            AND b.column_3 IS NOT NULL
    )