试图解决缺乏 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
)
我在过滤较长查询的结果时遇到了一些问题。
假设我们有三列,其中有一些示例行:
# 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
)